我在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 ..
我很感谢任何帮助..
当Dad的toString()要求age(),应被称为实际方法取决于运行时类型调用它的对象.由于该对象是的实例Sis,该age()方法Sis被调用,这也要求Gran的age(),因为它包含了一个电话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)