This question already has answers here:
Execution of Java static blocks in subclasses
(2个答案)
2年前关闭。
当我使用
由于静态在所有子类之间共享,因此应该更新该值。
其背后的原因可能是什么?
(2个答案)
2年前关闭。
当我使用
y
(Checks.y
是子类)调用静态变量Checks
时,不会执行静态块,并且y
的值不会更新。class Par {
static int y = 4;
}
class Checks extends Par {
static {
y = 5;
}
}
public class Check {
public static void main(String args[]) {
System.out.println(Checks.y); // here printing 4
}
}
由于静态在所有子类之间共享,因此应该更新该值。
其背后的原因可能是什么?
最佳答案
y
类未声明字段Checks
。
读取静态字段不会触发所引用类(Checks
)的初始化,除非该类是声明该字段的类(请参见下面的JLS引用)。在此示例中,即使通过y
访问Checks
,也只会触发Par
的初始化,因为Par
是声明y
的类。
换句话说,类Checks
在某种意义上是在运行时不使用的。
这也许说明了为什么通过子类访问static
成员是错误的,这会引起编译时警告。
the specification中有一个简单的解释:
最后一条注释说明了为什么未初始化您的子类。
08-28 18:15