混淆Java中的数据初始化

时间:2014-02-06 16:56:57

标签: java static

我对Java中的数据初始化有点困惑。我已经读过,在Class中调用任何方法之前,所有类字段都将首先被初始化。

考虑一下:

public class TestCls {

    public static int test = getInt();

    static{
        System.out.println("Static initializer: " + test);
    }

    public static int getInt(){

        System.out.println("giveInt func: " + test);
        return 10;
    }

    public static void main(String... args){
        System.out.println("Main: " + test);
    }

输出:

giveInt func: 0
static initializer: 10
main: 10

这里'test'字段通过调用驻留在同一个类中的getInt()函数来获取它的值。但是当调用getInt()时,'test'字段将被初始化为默认值,即0(参见getInt()函数内部)。我的问题是什么时候会调用getInt()函数?是在定义'test'字段时还是在初始化类中的所有字段后调用它。

2 个答案:

答案 0 :(得分:3)

以上是您的代码中发生的情况。

  1. 创建类,并将所有静态类级变量(属性,数据成员,您想要调用它们)初始化为适当的初始值(0表示int,null表示对象引用)。​​
  2. 从顶部开始,执行静态初始化块。
  3. 输入主要方法。
  4. 这会导致您看到的(正确)输出。

答案 1 :(得分:1)

您可以通过添加更多字段来对此进行测试。

public class TestCls {

    public static int test = getInt();
    public static int moreJunk = initializeMoreJunk();

    static{
        System.out.println("Static initializer: test=" + test + ", moreJunk=" + moreJunk);
    }

    public static int getInt(){

        System.out.println("giveInt func: " + test);
        System.out.println("moreJunk=" + moreJunk);
        return 10;
    }

    public static int initializeMoreJunk() {
        return -1;
    }

    public static void main(String... args){
        System.out.println("Main: " + test);
    } 
}

输出:

giveInt func: 0
moreJunk=0
Static initializer: test=10, moreJunk=-1
Main: 10

这表明类变量首先被初始化为它们的默认值(原始int默认为0),然后调用初始化块和方法,从类的顶部开始向下。