Java中数据初始化的困惑
我对Java中的数据初始化有点困惑。我已经读到,在类中调用任何方法之前,所有类字段都将首先初始化 考虑这一点:Java中数据初始化的困惑,java,static,Java,Static,我对Java中的数据初始化有点困惑。我已经读到,在类中调用任何方法之前,所有类字段都将首先初始化 考虑这一点: public class TestCls { public static int test = getInt(); static{ System.out.println("Static initializer: " + test); } public static int getInt(){ System.out.
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”字段时调用,还是在初始化类中所有字段后的最后一次调用。下面是上面代码中发生的情况
这将产生您看到的(正确的)输出。您可以通过添加更多字段来测试这一点
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
这表明类变量首先被初始化为它们的默认值(原语ints默认值为0),然后从类的顶部向下调用初始化块和方法。您阅读的是一个简化。请参阅JLS了解完整的故事。