如果在声明之前放置静态初始化程序错误

S E*_*S E 6 java static-initializer

我注意到静态初始化器中的某些内容可能是javac中的一个错误.我构建了一个场景,我可以为变量赋值,但不能读回该值.

下面是两个示例,第一个编译正常,第二个在尝试从tmp读取值时出错,但由于某种原因,允许为tmp分配值.我可以理解它是否既不能读取也不能写入变量,因为tmp是在静态初始化器之后声明的,但是只有其中一个错误对我来说没有意义.

//Compiles Successfully:
public class Script
{
    public static Object tmp;
    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }

}

//error only on the read but not the assignment
public class Script
{

    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }
    public static Object tmp;
}
Run Code Online (Sandbox Code Playgroud)

为了进一步强调这一点,这确实可以成功编译.

public class Script
{

    static
    {
        tmp = new Object();
    }
    public static Object tmp;
}
Run Code Online (Sandbox Code Playgroud)

zw3*_*324 2

似乎这是在规范中定义的(参见JLS 8.3.2.3):

仅当成员是类或接口 C 的实例(分别是静态)字段并且满足以下所有条件时,成员的声明才需要在使用之前以文本形式出现:

  • 该用法发生在 C 的实例(分别为静态)变量初始值设定项或
    C 的实例(分别为静态)初始值设定项中。

  • 用法不在赋值的左侧。

  • 用法是通过一个简单的名称。

  • C 是包含用法的最内部类或接口。

因此,如果用法位于赋值的左侧,那么它是合法的,因为第二个用法不再成立。