Java 继承、超级构造函数和私有方法
有人能解释下面代码的输出吗? 尝试在类B中扩展类A并重写方法goo()和 方法foo()是从构造函数调用的Java 继承、超级构造函数和私有方法,java,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() {
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
谢谢。首先,
私有
方法不会被继承。因此A
中的foo()
与B
中的foo()
不同
第二,当你打电话的时候
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 ");
}
当(直接或间接)调用可能从超级/父类构造函数重写的方法时,请小心。子对象的状态可能尚未初始化
foo()
未被重写。另请参见