使用重写方法在java中继承

Tuấ*_*hạm -1 java inheritance

我在java中进行了关于继承的练习:

public class Gran {
  private int x;
  public Gran() {
    this.x = 68; 
  }
  public int age() {
    this.x = this.x+1; return this.x; 
  }
  @Override
  public String toString() {
    return "Gran " + age();
  }
}

public class Dad extends Gran {
  private int x;
  public Dad(){
    this.x = 41; 
  }
  @Override
  public String toString() {
    return "Dad " + age();
  }
}

public class Sis extends Dad {
  private int x;
  public Sis() {
    this.x = 17;
  }
  @Override
  public int age() {
    System.out.print("Sis ");
    return super.age() - x;
  }
  @Override
  public String toString() {
    return "Sis " + super.toString();
  }
}
Run Code Online (Sandbox Code Playgroud)

所以当我实施时:

Gran[] family = new Gran[] { new Gran(), new Dad(), new Bro(), new Sis() };

for (Gran member : family) {
    System.out.println(member.toString());
}
Run Code Online (Sandbox Code Playgroud)

它显示了该成员 Sis : Sis Sis Dad 52

有人可以解释原因吗?

所以这就是我所想的,当Sis.toString()调用方法时,这意味着:

  • 返回 "Sis" + super.toString()
  • super.toString() = Dad.toString() = return "Dad" + age()

我很困惑为什么在这一点上age()方法被称为Sis,而不是来自Gran Gran ..

我很感谢任何帮助..

Era*_*ran 5

DadtoString()要求age(),应被称为实际方法取决于运行时类型调用它的对象.由于该对象是的实例Sis,该age()方法Sis被调用,这也要求Granage(),因为它包含了一个电话super.age().

所以,我们有:

return "Sis" + super.toString()
Run Code Online (Sandbox Code Playgroud)

哪里

super.toString() 
Run Code Online (Sandbox Code Playgroud)

回报

"Dad " + age()
Run Code Online (Sandbox Code Playgroud)

但在它返回"爸爸52"(age()返回69 - 17)之前,age()打印另一个"Sis"

所以最终的输出是

Sis Sis Dad 52
Run Code Online (Sandbox Code Playgroud)