在没有构造函数的类中初始化变量

时间:2014-01-11 14:22:44

标签: java

这是一些简单的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.为什么? 是否没有用于初始化的构造函数?

3 个答案:

答案 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;
    }
}