6

我注意到静态初始化程序中的某些内容可能是 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;
}

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

public class Script
{

    static
    {
        tmp = new Object();
    }
    public static Object tmp;
}
4

1 回答 1

3

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

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

  • 该用法出现在 C 的实例(分别为静态)变量初始化器或 C 的实例(分别为静态)初始化器
    中。

  • 用法不在作业的左侧。

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

  • C 是包含用法的最里面的类或接口。

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

于 2013-05-07T14:13:59.890 回答