静态变量加载过程

时间:2014-01-09 11:21:13

标签: java compiler-errors jvm vm-implementation

最近,我研究虚拟机如何加载静态变量,但是我遇到了如下问题:

public class Example{

    static{
        num = 3;
        System.out.print(num);
    }
    public static int num;
}

编译器报告错误。我认为num有内存区域和值。为什么我无法访问num变量?

1 个答案:

答案 0 :(得分:6)

static块和声明按照它们编码的顺序执行。这意味着在静态块执行时,尚未定义num字段。

简单的解决方法是将声明移到块上。

Java Language Specification Section 8.3.2.3(除其他外)表示变量可能会在声明之前分配,但变量的值可能不是< em>在声明变量之前访问,除非其名称是完全限定的,因此编译:

public class Example {
    static{
        num = 3; // assignment OK without qualifying the name
        System.out.print(Example.num); // name must be qualified to access value
    }
    public static int num;
}

更有趣的是,如果在声明之前访问变量,则使用其默认值,并且声明上的初始化仍然发生,因此此代码:

public class Example {
    static{
        System.out.println(Example.num); // uses default value
        num = 3;                         // assignment OK
        System.out.println(Example.num); // assigned value (3) is visible
    }

    public static int num = 1;           // initialization to 1 occurs

    static{
        System.out.print(Example.num);   // initialized value (1) is visible 
    }
}

生成此输出:

0
3
1

哇!