为什么这段代码打印20 20而不是20 10?

时间:2017-05-09 11:18:39

标签: java core

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.感谢提前。

3 个答案:

答案 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();指向子类,因此将调用其方法而不是父方法