我对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'字段时还是在初始化类中的所有字段后调用它。
答案 0 :(得分:3)
以上是您的代码中发生的情况。
这会导致您看到的(正确)输出。
答案 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),然后调用初始化块和方法,从类的顶部开始向下。