![](/img/trans.png)
[英]Why am I getting different outputs with .concat() and += with Java Strings?
[英]Why am I getting two different outputs in Java code
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'
,reference: 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
被初始化了。
在你的line 2
你正在调用int xyz = new B().show(); // prints c=0 and z=null
int xyz = new B().show(); // prints c=0 and z=null
在开头int xyz = new B().show(); // prints c=0 and z=null
。
哪个电话
class B {
int show() {
System.out.println("c=" + c);
System.out.println("z=" + z);
return -555;
}
}
在上面的代码中,您正在访问变量c
和Z
,它们是类的成员变量,并且由于尚未初始化,因此它们已被分配了默认值。
boolean => false
char => \u0000
int,short,byte / long => 0 / 0L
float /double => 0.0f / 0.0d
any reference type => null
在你的情况下, ìnt
分配给0
,对象引用分配给null
:)
将line 2
代码移动到line 4
,它应该打印,因为变量现在已初始化。
类被实例化,具有足够的内存以包含其所有'字段。
当你这样做时:
A p = new A();
这为A及其'字段(xyz,c,z和lmn)分配内存。 它们都在内存中分配了默认值(c是int所以0,z是对象所以null [地址是0x00])。
当你运行:
int xyz = new B().show(); // prints c=0 and z=null
您正在创建B的新实例。当该实例引用c和z时,它会打印它们的值。 目前它们是默认值。 对于所有意图和目的,show()的观点是它引用的所有字段都已定义/声明,或者至少已分配 。
然后当你执行:
B z = new B();
int lmn = z.show(); // prints c=-319
c和z都有了新的价值。 但是在代码中的所有点上,它们都已被分配并具有一些值(首先是默认值)。
在C类中创建A的Object时
A p = new A();
默认构造获取类,并使用具有默认值的类成员变量创建Object。 此时,类变量的值如下:
请参阅下面的屏幕截图以查看变量状态
当它达到以下语句以评估xyz值时:
int xyz = new B().show()
它打印了初始化尚未完成的c和z的值,因此我们将这些变量的默认值分别设置为0和NULL。
第二次,程序调用类B的show()方法。所有变量初始化都已完成,因为下面的语句一直执行到我们到达z.show()的时候
int c = -319;
b z= new (B); // call the default constructor of B to create object
请参阅下面的屏幕截图以查看变量状态。
因此,它将C的值打印为-319,将z打印为对象的十六进制值。 (不是null)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.