我在接受采访时被问到这个问题
如果你这样做,
private int c = d;
private int d;
Run Code Online (Sandbox Code Playgroud)
它会导致编译时错误
在定义之前无法引用字段.
来到面试问题,
1 public static int a = initializeStaticValue();
2 public static int b = 20;
3 public static int initializeStaticValue() {
4 return b;
}
5 public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
}
Run Code Online (Sandbox Code Playgroud)
我a通过调用initializeStaticValue()来获得与初始化相同的响应,其中它引用了一个未定义的值b.
但程序运行正常,编译和打印
0
20
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么
Cannot reference a field before it is defined.
Run Code Online (Sandbox Code Playgroud)
没被抛出.
其次,当我调试它时,为什么控制着陆
3 public static int initializeStaticValue() {
Run Code Online (Sandbox Code Playgroud)
我的意思是,为什么这是该计划的起始位置.
如果你担心初始化/执行的顺序,那么将会发生什么(我相信它不是很准确,只是给你一个想法):
Foo,它尝试Foo从类路径加载类Foo加载,静态变量分配默认值(0表示int)initializeStaticValue(),返回此时的值b(0),并将其分配给ab20.Foo 已成功加载和初始化,以及JVM调用 Foo.main()