This question already has answers here:
Polymorphism vs Overriding vs Overloading
(21个回答)
3年前关闭。
当我调用getAge和superresult方法时,我期望输出20 10,但是代码正在打印2020。提前致谢。
它将调用
请注意,如果您调用
(21个回答)
3年前关闭。
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,但是代码正在打印2020。提前致谢。
最佳答案
简短答案:您调用callAge
,因为它是在A
中实现的。但是该方法调用了被重写的getAge
(因此Java遵循在B
中完成的实现)。
较长版本的:
您打电话的时候:
classb.superesult();
它将调用
super.callAge()
,这意味着将执行callAge()
类的A
。 callAge()
会调用getAge()
,但由于该对象是B
类的实例,并且 getAge()
被覆盖,因此它返回20
。请注意,如果您调用
super.foo()
,则仅将称为超级foo 。 super
因此并不意味着您“更改上下文” :仍通过对对象的动态绑定来解析超级调用产生的所有调用(并且该对象仍然是B
的实例)。可以重写foo
的所有调用(除非将这些调用标记为final
)。在大多数情况下,这是所需的行为。09-26 09:26