此问题在此处已有答案:
Polymorphism vs Overriding vs Overloading(21个回答)
6年前关闭。
当我调用getAge
和superresult
方法时,我期望输出 20 10,但代码打印 20 20。为什么我得到不同的结果?
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());
}
}
字符串
3条答案
按热度按时间6l7fqoea1#
简答:你调用
callAge
,因为它是在A
中实现的。但是那个方法调用了getAge
,它被重写了(因此Java遵循了B
中的实现)。较长版本:
当您致电:
字符串
它将调用
super.callAge()
,所以这意味着类A
的callAge()
被执行。callAge()
在他的部分调用getAge()
,但由于对象是类B
的示例,getAge()
被重写,它返回20
。请注意,如果你调用
super.foo()
,你只是调用了super foo。super
并不意味着你“改变了上下文”**:超级调用产生的所有调用仍然通过对象上的动态绑定来解析(对象仍然是B
的示例)。所有foo
的调用都可以被覆盖(除非这些调用被标记为final
)。这在大多数情况下都是所需的对象。v7pvogib2#
它是polymorphism。你在
getAge()
方法中有ovveridden。所以当你调用这个方法时,ovverdien方法总是执行。Java虚拟机(JVM)为每个变量中引用的对象调用适当的方法。它不调用由变量类型定义的方法。这种行为称为虚拟方法调用,并演示了Java语言中重要的多态性特性的一个方面。
relj7zay3#
这是因为你在子类中覆盖了
getAge()
方法。现在因为MyClassB classb = new MyClassB();
指向子类,所以它的方法将被调用,而不是父方法