0

谁能解释下面代码的输出?尝试在 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

谢谢。

4

1 回答 1

8

首先,private方法不是继承的。所以foo()in与inA不同。foo()B

二、打电话的时候

A b = new B();

B, so的超级构造函数A被隐式调用,因此首先执行 this

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 ");
}

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

于 2013-10-10T19:02:00.290 回答