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)
似乎这是在规范中定义的(参见JLS 8.3.2.3):
仅当成员是类或接口 C 的实例(分别是静态)字段并且满足以下所有条件时,成员的声明才需要在使用之前以文本形式出现:
该用法发生在 C 的实例(分别为静态)变量初始值设定项或
C 的实例(分别为静态)初始值设定项中。用法不在赋值的左侧。
用法是通过一个简单的名称。
C 是包含用法的最内部类或接口。
因此,如果用法位于赋值的左侧,那么它是合法的,因为第二个用法不再成立。
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |