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());
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用getAge和superresult方法时,我期待20 10作为输出,但代码打印20 20.感谢提前.
简短的回答:你打电话给callAge它实现A.但是该方法调用getAge被覆盖的内容(因此Java遵循实现方式B).
更长的版本:
你打电话的时候:
classb.superesult();
Run Code Online (Sandbox Code Playgroud)
它将调用super.callAge(),这意味着callAge()类A的执行.callAge()在他的部分所调用getAge(),但因为对象是类的实例B和getAge()被覆盖,则返回20.
请注意,如果你打电话给super.foo()你只打电话给超级foo.super因此并不意味着你"改变上下文":超级调用产生的所有调用仍然通过对象的动态绑定来解决(并且对象仍然是一个实例B).foo可以覆盖所有呼叫(除非标记了这些呼叫final).在大多数情况下,这是理想的行为.