静态可变负载过程



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

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

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

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

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

Java 语言规范第 8.3.2.3 节(以及其他内容)说,变量可以在声明之前赋值,但在声明变量之前可能无法访问变量的值,除非其名称是完全限定的,因此编译:

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

哇!

最新更新