Java: subclass 调用 parent class 方法
Java: subclass calling parent class methods
我有一个 parent class Shape 和一个 subclass Rectangle, 我parent class Shape 中有一个名为 Output 的方法。
如何在 children class?
中调用 parent class 方法 Output
ParentClass
public class Shape {
public int edge;
public Shape(int Gedge) {
edge=Gedge;
}
public void Output() {
System.out.println("This shape has "+edge+" eges");
}
}
子class:
public class Rectangle extends Shape {
public int edge, length, width;
public Rectangle(int Gedge, int Glength, int Gwidth) {
super (Gedge);
edge=Gedge;
length=Glength;
width=Gwidth;
}
public void Output1() {
//I want to call the parent class Method "Output" here.
System.out.println("The Area is "+length*width);
}
public static void main (String [] args) {
Rectangle A1=new Rectangle(4,3,5);
A1.Output1();
}
}
如果我现在运行这段代码,输出是The Area is 15,但是我想调用Shape 中的输出方法,因此理想情况下它会打印
这个形状有4条边
面积为15
感谢您的帮助。谢谢
只需调用方法:
public void Output1()
{
Output();
System.out.println("The Area is "+length*width);
}
不需要 super
关键字,因为您没有调用被 Output1
方法覆盖的基础 class 方法。您正在调用不同的方法。
我认为在你的例子中具体形状必须是接口(方法 area() 和 (Rect,Square..) 实现它。回到你的问题,因为那在你的 parent class 输出是 public 你可以从 child class 这样做:super.Output();
由于其他人已经回答了这个问题(调用 super.Output() 或仅调用 Output() 都是正确的),我将尝试更清楚地说明为什么两者都是正确的(而且它是主要是由于您的命名约定)。
当你在 class 之间有父子关系时,像这样:
class A {
public void doStuff(){
System.out.println("Doing A Stuff!");
}
}
class B extends A {
public void doStuff(){
System.out.println("Doing B Stuff!");
}
}
您正在做的是覆盖 doStuff 方法。行为如下:
A a = new B(); // A is the parent type of a, B is the actual type.
a.doStuff(); // prints "Doing B stuff!"
当您在 Java 中重写时,该方法必须具有完全相同的名称、参数列表(以相同的顺序)和 return 类型。因此,在您的示例中,Output1 不是 Output 的覆盖。这就是为什么您实际上可以在 subclass 中的任何位置调用 Output() 而无需 'super' 关键字的原因。如果您要重构您的代码以使两个方法具有相同的签名,那么是的,调用父 class 行为的唯一方法是在重写方法中调用 super.Output()。事实上,如果您随后按以下方式编写 subclass B,则对 doStuff 的调用将是递归调用,并且该方法将递归直到遇到堆栈溢出(因此,您需要使用 super.doStuff()):
class B extends A {
public void doStuff(){
doStuff(); // BAD CODE!! Use super.doStuff() here instead!
System.out.println("Doing B Stuff!");
}
}
另一种可以确保调用 superclass 方法的方法是用超类型的实际类型实例化对象,但是这样你就失去了 sub[=33= 的所有功能]:
A a = new A(); //both parent type and actual type of a is A
a.doStuff(); // prints "Doing A stuff!" (can't print "Doing B Stuff!")
此外,如评论所述,您应该查看 this question,这将为您指明官方 Java 风格指南和约定的方向。关于您的代码的一些快速注意事项是局部变量(A1 应该是 a1)和方法(Output() 应该是 output())缺少小驼峰大小写
我有一个 parent class Shape 和一个 subclass Rectangle, 我parent class Shape 中有一个名为 Output 的方法。 如何在 children class?
中调用 parent class 方法 OutputParentClass
public class Shape {
public int edge;
public Shape(int Gedge) {
edge=Gedge;
}
public void Output() {
System.out.println("This shape has "+edge+" eges");
}
}
子class:
public class Rectangle extends Shape {
public int edge, length, width;
public Rectangle(int Gedge, int Glength, int Gwidth) {
super (Gedge);
edge=Gedge;
length=Glength;
width=Gwidth;
}
public void Output1() {
//I want to call the parent class Method "Output" here.
System.out.println("The Area is "+length*width);
}
public static void main (String [] args) {
Rectangle A1=new Rectangle(4,3,5);
A1.Output1();
}
}
如果我现在运行这段代码,输出是The Area is 15,但是我想调用Shape 中的输出方法,因此理想情况下它会打印
这个形状有4条边
面积为15
感谢您的帮助。谢谢
只需调用方法:
public void Output1()
{
Output();
System.out.println("The Area is "+length*width);
}
不需要 super
关键字,因为您没有调用被 Output1
方法覆盖的基础 class 方法。您正在调用不同的方法。
我认为在你的例子中具体形状必须是接口(方法 area() 和 (Rect,Square..) 实现它。回到你的问题,因为那在你的 parent class 输出是 public 你可以从 child class 这样做:super.Output();
由于其他人已经回答了这个问题(调用 super.Output() 或仅调用 Output() 都是正确的),我将尝试更清楚地说明为什么两者都是正确的(而且它是主要是由于您的命名约定)。
当你在 class 之间有父子关系时,像这样:
class A {
public void doStuff(){
System.out.println("Doing A Stuff!");
}
}
class B extends A {
public void doStuff(){
System.out.println("Doing B Stuff!");
}
}
您正在做的是覆盖 doStuff 方法。行为如下:
A a = new B(); // A is the parent type of a, B is the actual type.
a.doStuff(); // prints "Doing B stuff!"
当您在 Java 中重写时,该方法必须具有完全相同的名称、参数列表(以相同的顺序)和 return 类型。因此,在您的示例中,Output1 不是 Output 的覆盖。这就是为什么您实际上可以在 subclass 中的任何位置调用 Output() 而无需 'super' 关键字的原因。如果您要重构您的代码以使两个方法具有相同的签名,那么是的,调用父 class 行为的唯一方法是在重写方法中调用 super.Output()。事实上,如果您随后按以下方式编写 subclass B,则对 doStuff 的调用将是递归调用,并且该方法将递归直到遇到堆栈溢出(因此,您需要使用 super.doStuff()):
class B extends A {
public void doStuff(){
doStuff(); // BAD CODE!! Use super.doStuff() here instead!
System.out.println("Doing B Stuff!");
}
}
另一种可以确保调用 superclass 方法的方法是用超类型的实际类型实例化对象,但是这样你就失去了 sub[=33= 的所有功能]:
A a = new A(); //both parent type and actual type of a is A
a.doStuff(); // prints "Doing A stuff!" (can't print "Doing B Stuff!")
此外,如评论所述,您应该查看 this question,这将为您指明官方 Java 风格指南和约定的方向。关于您的代码的一些快速注意事项是局部变量(A1 应该是 a1)和方法(Output() 应该是 output())缺少小驼峰大小写