访问构造函数中的实例成员

amo*_*214 3 java constructor instance-variables super

我在一本书中读到,实例成员只有在超级构造函数运行后才能访问.

我偶然发现了以下代码:

class Parent {

    Parent() {
        printIt();
    }

    void printIt() {
        System.out.println("I'm in a overridden method. Great.");
    }
}

class Child extends Parent {

    int i = 100;

    public static void main(String[] args) {
        Parent p = new Child();
        p.printIt();
    }

    void printIt() {
        System.out.print(i + " ");
    }
}
Run Code Online (Sandbox Code Playgroud)

它打印:

0 100

我的问题是:

如果只有在超级构造函数运行后才能访问实例成员,那么为什么在执行类Parent的printIt()方法时(由于多态性实际上是Child的printIt()),它能够访问未初始化的尽管Parent的构造函数尚未执行,但是Child的实例变量i?

我错过了什么?

use*_*421 7

我在一本书中读到,实例成员只有在超级构造函数运行后才能访问.

你的书是错的(如果那是它真正的说法).一旦施工开始,它们随时都可以使用.但是,在超级构造函数运行之后才会初始化它们.所以你打印的是默认值:null,zero或false.

  • "一旦施工开始,它们随时都可以访问.但是在超级构造函数运行之后它们才会被初始化."---很棒的一点.+1 (2认同)