我遇到了一个问题
“关于‘默认’构造函数,以下哪一项是正确的?”
和一个选项
“它初始化类的实例成员。”
是错误的选择。
现在我的理解是,如果我们有这样的代码
Class Test {
String name;
}
然后编译器创建默认构造函数,如下所示
Class Test {
String name;
Test(){
super();
name = null;
}
}
默认构造函数不是初始化实例成员 name=null 吗?
类构造函数不是进行初始化的,而是 JVM 执行此操作.
为对象分配内存后,对象的成员默认初始化为某个可预测的值,该值成为它们的默认值。这一切都完成了before构造函数被调用!
根据规格 http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.12.5
- 每个类变量、实例变量或数组组件在创建时都会使用默认值进行初始化(§15.9 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9, §15.10.2 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.10.2):
- 对于 byte 类型,默认值为零,即
(byte)0
.
- 对于short类型,默认值为零,即
(short)0
.
- 对于 int 类型,默认值为零,即
0
.
- 对于 long 类型,默认值为零,即
0L
.
- 对于 float 类型,默认值为正零,即
0.0f
.
- 对于 double 类型,默认值为正零,即
0.0d
.
- 对于 char 类型,默认值为空字符,即
'\u0000'
.
- 对于布尔类型,默认值为
false
.
- 对于所有参考类型(§4.3 http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.3),默认值为
null
.
您的假设很接近,但事实是,在评估构造函数参数之前,甚至在为每个字段分配值之前 - 这些字段已经保存了它们的默认值,这是由 JVM 完成的。
阅读小节§15.9.4 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.9.4了解初始化过程是如何进行的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)