默认构造函数不初始化类的实例成员?

SER*_*ich 15 java constructor default-constructor

我遇到一个问题,询问"关于"默认"构造函数,以下哪一项是正确的?"

和一个选项"它初始化类的实例成员." 是不正确的选择.

现在我的理解是,如果我们有一个代码,如

    Class Test {
        String name;
    }
Run Code Online (Sandbox Code Playgroud)

然后编译器创建看起来像的默认构造函数

    Class Test {
        String name;
        Test(){
            super();
            name = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

是不是默认构造函数初始化实例成员name = null?

sma*_*c89 10

类构造函数不是进行初始化的那个,JVM就是这样做的.创建对象的内存后,对象的成员将默认初始化为某个可预测值,该值将成为其默认值.

根据规范

  • 每个类变量,实例变量或数组组件在创建时都会使用默认值进行初始化(§15.9,§15.10.2):
    • 对于type byte,默认值为零,即值(byte)0.
    • 对于short类型,默认值为零,即值(short)0.
    • 对于int类型,默认值为零,即0.
    • 对于long类型,默认值为零,即0L.
    • 对于float类型,默认值为正零,即0.0f.
    • 对于double类型,默认值为正零,即0.0d.
    • 对于char类型,默认值为空字符,即'\u0000'.
    • 对于boolean类型,默认值为false.
    • 对于所有引用类型(§4.3),默认值为null.

您的假设很接近,但事实是,在构造函数参数被评估之前 - 甚至在为每个字段分配值之前 - 这些字段已经保持其默认值,这是由JVM完成的.

阅读第15.9.4小节以了解如何执行初始化过程