在java中初始化静态变量

Shi*_*han 3 java static

我在接受采访时被问到这个问题

如果你这样做,

    private int c = d;
    private int d;
Run Code Online (Sandbox Code Playgroud)

它会导致编译时错误

在定义之前无法引用字段.

来到面试问题,

    1  public static int a = initializeStaticValue();
    2  public static int b = 20;


    3  public static int initializeStaticValue() {
    4   return b;

       }

    5   public static void main(String[] args) {
           System.out.println(a);
           System.out.println(b);
        }
Run Code Online (Sandbox Code Playgroud)

a通过调用initializeStaticValue()来获得与初始化相同的响应,其中它引用了一个未定义的b.

但程序运行正常,编译和打印

0
20
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么

Cannot reference a field before it is defined. 
Run Code Online (Sandbox Code Playgroud)

没被抛出.

其次,当我调试它时,为什么控制着陆

3  public static int initializeStaticValue() {
Run Code Online (Sandbox Code Playgroud)

我的意思是,为什么这是该计划的起始位置.

Adr*_*hum 5

如果你担心初始化/执行的顺序,那么将会发生什么(我相信它不是很准确,只是给你一个想法):

  1. 要求JVM运行Java应用程序(假设您的类已命名)Foo,它尝试Foo从类路径加载类
  2. Foo加载,静态变量分配默认值(0表示int)
  3. 将执行静态初始化程序,首先在第1行运行,然后在第1行调用initializeStaticValue(),返回此时的值b(0),并将其分配给a
  4. 静态初始化继续,并进入第2行.它分配b20.
  5. Foo 已成功加载和初始化,以及JVM调用 Foo.main()

  • @AdrianShum,不建议要求接受,它会对提问者施加压力.但是答案很好. (2认同)