java 为什么这个代码是20 20而不是20 10?

1l5u6lss  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(84)

此问题在此处已有答案

Polymorphism vs Overriding vs Overloading(21个回答)
6年前关闭。
当我调用getAgesuperresult方法时,我期望输出 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());
    }
}

字符串

6l7fqoea

6l7fqoea1#

简答:你调用callAge,因为它是在A中实现的。但是那个方法调用了getAge,它被重写了(因此Java遵循了B中的实现)。
较长版本

当您致电:

classb.superesult();

字符串
它将调用super.callAge(),所以这意味着类AcallAge()被执行。callAge()在他的部分调用getAge(),但由于对象是类B的示例,getAge()被重写,它返回20
请注意,如果你调用super.foo(),你只是调用了super foosuper并不意味着你“改变了上下文”**:超级调用产生的所有调用仍然通过对象上的动态绑定来解析(对象仍然是B的示例)。所有foo的调用都可以被覆盖(除非这些调用被标记为final)。这在大多数情况下都是所需的对象。

v7pvogib

v7pvogib2#

它是polymorphism。你在getAge()方法中有ovveridden。所以当你调用这个方法时,ovverdien方法总是执行。
Java虚拟机(JVM)为每个变量中引用的对象调用适当的方法。它不调用由变量类型定义的方法。这种行为称为虚拟方法调用,并演示了Java语言中重要的多态性特性的一个方面。

relj7zay

relj7zay3#

这是因为你在子类中覆盖了getAge()方法。现在因为MyClassB classb = new MyClassB();指向子类,所以它的方法将被调用,而不是父方法

相关问题