[英]variable initialization by constructor
关于变量x3,哪个构造函数对其进行初始化? 我似乎无法弄清楚。 会是X类的无参数构造函数吗? 还是对象类的默认构造函数?
class X {
int x1, x2, x3;
}
x3
是一个实例变量,它将具有默认值0(对于int)。 从Java文档:
声明字段时,不一定总是需要分配值。 编译器会将已声明但未初始化的字段设置为合理的默认值 。 通常,此默认值将为零或null,具体取决于数据类型。
但是,通常认为依赖于此类默认值是不好的编程风格。
如果它是局部变量(例如在方法中创建的局部变量),则必须对其进行初始化。 所以我会说, class X
的默认构造函数初始化x3
,或者可以说,默认情况下它将初始化为0。
public class Hello {
private int x;
private int y = 0;
}
这将导致以下类文件:
public class Hello {
// Field descriptor #6 I
private int x;
// Field descriptor #6 I
private int y;
// Method descriptor #9 ()V
// Stack: 2, Locals: 1
public Hello();
0 aload_0 [this]
1 invokespecial java.lang.Object() [11]
4 aload_0 [this]
5 iconst_0
6 putfield Hello.y : int [13]
9 return
}
如果我正确阅读以上内容:
y
在隐式无参数构造函数中初始化 x
在任何构造函数中都没有初始化
0
给它-但是这个初始化没有在字节码看到,所以它可能留给编译器来决定何时初始化(即你不应该依赖于变量的初始化任何特定时刻-即使您通过观察确定何时发生这种情况,也无法保证将来不会更改或在不同的JVM之间不会更改。 在进入构造函数之前,将它们初始化为相关的默认值(零或null)。
参见以下类似问题(链接至JLS):
其他任何事情似乎都可能危及Java环境的封装。 如果未初始化字段,则可能会暴露未初始化的数据,并且恶意程序可能会利用该字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.