任何人都可以解释下面代码的输出吗? 试图在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
感谢。
答案 0 :(得分:8)
首先,private
方法不会被继承。因此foo()
中的A
与foo()
中的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 ");
}
在(直接或间接)调用可能从超级/父类构造函数覆盖的方法时要小心。子对象的状态可能尚未初始化。