继承,超级构造函数和私有方法

时间:2013-10-10 18:59:17

标签: java

任何人都可以解释下面代码的输出吗? 试图在B类中扩展A类并重写方法goo()和 方法foo()从构造函数中调用。

public class A {

    public A() {
        foo();
    }

    private void foo() { // Private function foo()
        System.out.print("A::foo ");
        goo();
    }

    public void goo() {
        System.out.print("A::goo ");
    }
}


public class B extends A {

    public B() {
        foo();
    }

    public void foo() {
        System.out.print("B::foo ");
    }

    public void goo() {
        System.out.print("B::goo ");
    }

}


public class C {

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

}

输出:A :: foo B :: goo B :: foo

感谢。

1 个答案:

答案 0 :(得分:8)

首先,private方法不会被继承。因此foo()中的Afoo()中的B不同。

其次,当你打电话

A b = new B();

B的超级构造函数,所以A,是隐式调用的,因此首先执行

public A() {
    foo(); // A's version
}

private void foo() { // Private function foo()
    System.out.print("A::foo ");
    goo();
}

goo()以多态方式执行,即。 B的实施。

public void goo() {
    System.out.print("B::goo ");
}

然后执行B构造函数,执行

public B() {
    foo(); // B's version
}

public void foo() {
    System.out.print("B::foo ");
}

在(直接或间接)调用可能从超级/父类构造函数覆盖的方法时要小心。子对象的状态可能尚未初始化。