我不明白为什么foo的内容会根据您从哪个类访问它而变化。
基本上,这是类型初始化的问题。的值
foo设置为
"bar"when
Sub初始化。但是,在您的
Testing类中,对的引用
Sub.foo实际上已编译为对的引用
Super.foo,因此它不会最终初始化
Sub,因此
foo永远不会成为
"bar"。
如果您将测试代码更改为:
public class Testing { public static void main (String[] args) { Sub.main(args); System.out.println(Super.foo); System.out.println(Sub.foo); System.out.println(Super.foo); }}然后它将打印出“ bar”四次,因为第一条语句将被强制
Sub初始化,这将更改的值
foo。根本不关从哪里访问它。
请注意,这不仅与类 加载 有关,还与类 初始化有关 。无需初始化即可加载类。例如:
public class Testing { public static void main (String[] args) { System.out.println(Super.foo); System.out.println(Sub.class); System.out.println(Super.foo); }}仍然会打印两次“ foo”,表明
Sub尚未初始化-但肯定已 加载 ,例如,如果您
Sub.class在运行文件之前删除文件,则该程序将失败。



