继承方法的调用顺序

时间:2019-07-23 18:14:28

标签: java inheritance

给出以下代码:

public class A {
    private int x = 5;

    public void hidden() {
        System.out.println(x);
    }

    public void show() {
        hidden();
    }
}

class B extends A {
    public int x = 10;

    public void hidden() {
        System.out.println(x);
    }

    public static void main(String[] args) {
        B b = new B();
        b.show();
    }
}

有人可以解释为什么输出为10吗?换句话说,为什么在show()方法中调用hidden()方法执行类B的hidden()方法中的代码,而将A类的hidden()方法设为私有将提供输出5?

3 个答案:

答案 0 :(得分:0)

私有方法不能被覆盖。当您将A的hidden()声明为私有时,B不会覆盖它。您可以通过在B的hidden()中添加@Override注释来验证这一点。

答案 1 :(得分:0)

简单,B作为A的子代,拥有A拥有的所有数据+ B's自己的数据+方法

因此,当您有一个B对象并调用b.show()时,编译器会检查show()中是否有B方法,这是错误的,因此它会检查A是否具有它并到达那里,当您在hidden()中调用show()时,由于对象调用是B类型,并且编译器位于A类中,因此编译器将再次进行检查,它将检查是否当前的方法在B中被覆盖,这是正确的,因此它调用B's hidden()方法打印10

否则,如果hidden()是私有的,并且编译器位于A类中,则由于hidden()中的当前A是私有的并且未被覆盖,因此覆盖检查将失败,因此它使用{{ 1}}版本并打印5

注意:对于优先合同,编译器将尽最大努力检查当前要调用的方法是否存在于名为它的当前对象中

答案 2 :(得分:0)

如果hidden()A中是私有的,则hidden()中的B无法覆盖私有方法,并且因为show()在{{1}中没有被覆盖} 任一,将打印5。

您可以再次打印B,并在10中创建hidden(),将{{1}中的A保留为{ {1}}:

show()