Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 继承、超级构造函数和私有方法_Java - Fatal编程技术网

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

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() {

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


谢谢。

首先,
私有
方法不会被继承。因此
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()
未被重写。另请参见