Java初始化顺序错误

Iza*_*rek 2 java static

我想问一下为什么以下代码会导致错误:

class A
{
    A()
    {
       statObj.x = 5; 
    }

    int x;
    static A statObj = new A();
}
Run Code Online (Sandbox Code Playgroud)

我得到了ExceptionInInitializerError.我不明白为什么.在这种情况下,静态变量statObj将初始化为第一个.所以,如果我是对的,静态对象statObj = new A()将被创建为第一个.

这个内部静态对象的创建和初始化顺序是什么?在调用内部静态对象构造函数之前,statObj.x是否默认初始化为0值statObj.A()?如果是这样,为什么statObj.x表现得像它没有被初始化(我打过它默认初始化为0值)?

还有一个为什么这个问题只发生在构造函数而不是方法中?以下代码工作正常:

        class A
        {
            A()
            {  
            }

            void met1()
            {
                statObj.x = 5; 
            }

            int x;
            static A statObj = new A();
        }


        public MainClass
        {
            public static void main(String[] arg)
            {
                A a = new A();
                a.statObj.met1();
            }
        }
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 9

考虑会发生什么.以下静态初始化程序:

static A statObj = new A();
Run Code Online (Sandbox Code Playgroud)

调用A(),然后尝试访问statObj:

A() {
  statObj.x = 5; 
}
Run Code Online (Sandbox Code Playgroud)

但是,此时statObj尚未初始化,因此null.NullPointerException抛出A ,然后将其转换为ExceptionInInitializerError(因为NPE已经在静态初始化器中发生).

第二个示例没有此问题,因为在您尝试访问时statObj,它已完全初始化.

  • 不,"statObj"尚未分配,它将在构造函数"A()"完成后分配. (2认同)