这是一些简单的java代码。
class Test {
public static void main(final String[] args) {
TestClass c = new TestClass();
System.out.println(c.x);
}
}
class TestClass {
{
x = 2;
}
int x = 1;
}
我得到答案1.为什么? 是否没有用于初始化的构造函数?
答案 0 :(得分:6)
TestClass被编译为等同于:
class TestClass {
{
this.x = 2;
}
int x;
{
this.x = 1;
}
}
答案 1 :(得分:5)
初始化程序块和变量初始化程序的执行顺序在JLS § 12.5:
中指定在对新创建的对象的引用之前返回为 结果,处理指示的构造函数以初始化new 使用以下过程对象:
[...]
4为此类执行实例初始值设定项和实例变量初始值设定项,分配实例变量的值 初始化器到相应的实例变量中 从左到右的顺序,它们在源代码中以文本形式出现 为了上课。 [..]
因此,初始化程序块和变量初始化程序按它们出现在源文件中的顺序执行。如果您在初始化程序段之前移动变量声明int x = 1;
,则会得到结果2
。
从技术上讲,您的Test
类编译为:
class TestClass {
int x;
public TestClass() {
super();
x = 2;
x = 1;
}
}
对于实际的字节码,您可以运行javap -c
命令。
答案 2 :(得分:1)
因为它会被编译为:
class TestClass {
int x;
TestClass(){
this.x = 2;
this.x = 1;
}
}