【发布时间】:2015-03-28 12:43:15
【问题描述】:
class A {
int xyz = new B().show(); // prints c=0 and z=null
int c = -319;
B z = new B();
int lmn = z.show(); // prints c=-319
class B {
int show() {
System.out.println("c=" + c);
System.out.println("z=" + z);
return -555;
}
}
}
class C {
public static void main(String args[]) {
A p = new A();
}
}
为什么我最初收到c=0,然后是c=-319。同样,为什么 z 最初是 null 而之后不是 null。代码中发生了什么?
【问题讨论】:
-
初始化按顺序进行,从上到下。如果你去掉
A类并将逻辑粘贴到方法a()中,那么发生了什么应该是显而易见的。 -
该语句 int xyz=new B().show() 不应该给出错误“非法前向引用”,因为 show() 使用了尚未分配内存的 c?
-
为什么?那是另一个类。如果只能引用按顺序声明的类,Java 确实是一种非常奇怪的语言……
-
是的。但是它使用了 A 类的 c 变量,在这个阶段(xyz=new B().show())还没有在内存中创建。
-
这正是leaking
thisin a constructor被认为是反模式的原因。
标签: java oop object inner-classes