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.

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

考虑这一点:

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表示int,null表示对象引用)
  • 从顶部开始,执行静态初始化块
  • 输入主方法

  • 这将产生您看到的(正确的)输出。

    您可以通过添加更多字段来测试这一点

    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了解完整的故事。