Java:子类调用父类方法

时间:2015-03-01 17:21:21

标签: java inheritance methods

我有一个父类 Shape 和一个子类 Rectangle ,我在父类Shape中有一个名为输出的方法。 如何在子类中调用父类方法输出

父类

public class Shape {
  public int edge;
  public Shape(int Gedge) {
    edge=Gedge;
  }
  public void Output() {
    System.out.println("This shape has "+edge+" eges");
  }
}

子类:

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();
}
}

如果我现在运行此代码,输出为 区域为15 ,但我想在Shape中调用Output方法,因此理想情况下它会打印

此形状有4条边

区域为15

帮助得到赞赏。感谢

3 个答案:

答案 0 :(得分:3)

只需调用方法:

public void Output1() 
{
    Output();
    System.out.println("The Area is "+length*width);
}

不需要super关键字,因为您没有调用被Output1方法覆盖的基类方法。你正在调用另一种方法。

答案 1 :(得分:0)

我认为在你的例子中,具体的形状必须是接口(方法area()和(Rect,Square ..)实现它。回到你的问题,因为那是在你的父类输出是公共的,你可以从孩子做上课:super.Output();

答案 2 :(得分:0)

由于其他人已经回答了这个问题(调用super.Output()或只调用Output()是正确的),我会尝试更清楚地说明为什么两者都是正确的(并且它是正确的)主要是由于你的命名惯例。)

当你在类之间有父子关系时,如下所示:

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中重写时,该方法必须具有完全相同的名称,参数列表(按相同顺序)和返回类型。所以在你的例子中,Output1不是Output的重写。这就是为什么你实际上可以在你的子类中的任何地方调用Output(),而不需要超级&#39;关键词。如果您要重构代码以使两个方法具有相同的签名,那么是,调用父类行为的唯一方法是在重写方法中调用super.Output()。实际上,如果你以下面的方式写了你的子类B,那么对doStuff的调用将是一个递归调用,并且该方法会递归直到你遇到堆栈溢出(因此,你需要使用super.doStuff()):< / p>

class B extends A {
    public void doStuff(){

        doStuff(); // BAD CODE!! Use super.doStuff() here instead!

        System.out.println("Doing B Stuff!");
    }
}

另一种确保调用超类方法的方法是使用实​​际类型的超类来实例化对象,但是你失去了子类的所有功能:

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)和方法(输出()应该输出())