在java中初始化静态变量

时间:2015-05-29 01:03:33

标签: java static

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

如果您这样做,

    private int c = d;
    private int d;

导致您

的编译时错误

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

来到面试问题,

    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);
        }

我通过调用 initializeStaticValue() 来初始化a时给出了相同的响应,其中 引用了未定义的< / em> 价值b

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

0
20

我很困惑为什么

Cannot reference a field before it is defined. 

没有被抛出。

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

3  public static int initializeStaticValue() {

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

1 个答案:

答案 0 :(得分:5)

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

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