package package1;
public class MyClassA {
protected int size;
public MyClassA() {
}
protected int getAge() {
return 10;
}
public int callAge() {
return getAge();
}
}
package package2;
import package1.MyClassA;
public class MyClassB extends MyClassA {
protected int getAge() {
return 20;
}
private int superesult() {
return super.callAge();
}
public static void main(String args[]) {
MyClassB classb = new MyClassB();
System.out.println(classb.getAge());
System.out.println(classb.superesult());
}
}
当我调用getAge和superresult方法时,我期待20 10作为输出,但代码打印20 20.感谢提前。
答案 0 :(得分:5)
简短回答:您在static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
中实施了callAge
。但是该方法调用覆盖的A
(因此Java遵循实现,就像在getAge
中一样)。
更长的版本:
致电时:
B
它将调用classb.superesult();
,这意味着执行了super.callAge()
类callAge()
。 A
在他的部分调用callAge()
,但由于该对象是类getAge()
的实例而 B
被覆盖,因此返回getAge()
}。
请注意,如果您致电20
,则只能致电超级富豪。 super.foo()
因此并不意味着你改变上下文" :所有通过超级调用产生的调用仍然通过对象的动态绑定来解决(并且该对象仍然是super
)的实例。可以覆盖所有调用B
(除非这些调用标记为foo
)。在大多数情况下,这是理想的行为。
答案 1 :(得分:3)
它是polymorphism。你在getAge()
方法中已经完成了。因此,当您调用该方法时,ovverdien方法始终执行。
Java虚拟机(JVM)为每个变量中引用的对象调用适当的方法。它不会调用由变量类型定义的方法。此行为称为虚方法调用,并演示了Java语言中重要多态特征的一个方面。
答案 2 :(得分:1)
因为你在子类中有覆盖getAge()
方法。现在MyClassB classb = new MyClassB();
指向子类,因此将调用其方法而不是父方法