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