静态阻塞后是否初始化了Java静态成员?

时间:2014-05-13 03:03:59

标签: java static-methods static-members

有没有理由在静态块之前不会实例化静态最终变量?
所以在我提供的例子中将打印:

someVar value= null

而不是:

 someVar value=SomeValue


我今天看到了这种行为,在我的申请中, 我试图重现 - 不成功 - 我确实看到了静态成员的价值......

class SomeClass{
    static final String someVar ="SomeValue";

    static{
         System.out.println("someVar value=" + someVar );
   }

public static void main(String[] args){     
    new SomeClass();
}

}

3 个答案:

答案 0 :(得分:2)

初始化顺序在JSL #12.4.2

中给出

对于静态初始化:

  • 以文本顺序执行类的类变量初始化程序和静态初始值设定项,或接口的字段初始值设定项,就好像它们是单个块一样。

施工:

  • 评估参数并递归处理超类构造函数调用

  • 为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,在这些顺序中它们以文本方式出现在源代码中类。

  • 执行此构造函数的其余部分。

请注意,初始化程序块和变量初始值设定项一起考虑,而不是单独考虑。

答案 1 :(得分:0)

我想说,这取决于你的代码序列。在您的本地运行以下代码,它会告诉您答案。

public class SomeClass{
    static final String someVar ="SomeValue";
    static final StaticMember staticMem = new StaticMember(1);

    static{
        System.out.println("someVar value=" + someVar );
    }

    static final StaticMember staticMem2 = new StaticMember(2);

    public static void main(String[] args){     
        new SomeClass();
    }

}

class StaticMember {
    StaticMember(int num) {
        System.out.println("StaticMember constructor " + num);
    }
}

答案 2 :(得分:0)

jvm会有一个命令,并且始终处于优先级:

  1. 静态阻止
  2. 静态会员
  3. 实例块
  4. 实例会员
  5. 构造
  6. 如果你有继承,那么实例化顺序会有所不同:

    1. 父静态阻止
    2. 家长静态会员
    3. 儿童静态阻挡
    4. 儿童静态会员
    5. 家长非静态会员
    6. 儿童非静态会员
    7. 父构造函数
    8. 子构造函数
    9. 我希望这能澄清你的问题。