java - 在构造函数中访问实例成员

标签 java constructor instance-variables super

我在一本书上看到,实例成员只有在 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 + " ");
    }
}

并打印:

0 100

我的问题是:

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

我错过了什么?

最佳答案

I read in a book that instance members are accessible only after the super constructor runs.

你的书错了(如果它真的是这么说的话)。一旦施工开始,它们随时都可以访问。但是,在 super 构造函数运行之前,它们不会被初始化。所以您打印的是默认值:null、零或 false。

关于java - 在构造函数中访问实例成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12136544/

相关文章:

java - 什么是NullPointerException,我该如何解决?

php - 如何定义一个只有在没有参数传递给构造函数时才能实例化的类?

JavaScript OOPS 问题

ruby-on-rails - 有没有办法在 Rails 中一次检查所有 Controller 变量?

java - 带注释的 Spring 依赖注入(inject)

java - Triple DES 中的 IV 在哪里?

C++ 构造如果满足条件

c++ - 通过引用传递参数与使用实例变量

用于监视文本文件更改的 Java 代码

c++ - 具有模板参数推导的构造函数意外执行