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
。代码中发生了什么?
最佳答案
您需要知道 new
运算符负责创建类的空实例(实例的字段将具有默认值:numeric:0
; boolean 值:false
,char:'\0'
,引用:null
)。 new
完成工作后调用构造函数代码,并负责为此类空对象设置正确的状态。
现在字段的初始化发生在构造函数中,所以你的代码
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 A {
int xyz = 0; //default values
int c = 0; //
B z = null; //
int lmn = 0; //
A(){
xyz = new B().show();
c = -319;
z = new B();
lmn = z.show();
}
class B {
int show() {
System.out.println("c=" + c);
System.out.println("z=" + z);
return -555;
}
}
}
还有
xyz = new B().show();
与
相同xyz = this.new B().show();
这样创建的 B
实例将可以访问在当前 A
构造函数中初始化的 A
实例。但是初始化 b
和 z
int c = -319;
B z = new B();
发生在您的第一个 show()
方法(使用 b
和 z
)之后,这意味着将显示它们的默认值。
第二个show()
不存在这个问题
lmn = z.show();
因为现在 b
和 z
都被初始化了。
关于java - 为什么我在 Java 代码中得到两个不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29317289/