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())缺少小驼峰大小写