我不确定new关键字在Java中的行为.是否可以确保每次使用new关键字时,都会在堆上创建一个新的Object?
当我在学习以下示例时,我对此产生了怀疑
class Mixer {
Mixer() { }
Mixer(Mixer m) { m1 = m; }
Mixer m1;
public static void main(String[] args) {
Mixer m2 = new Mixer();
Mixer m3 = new Mixer(m2); // Does it create any new mixer object?
m3.go();
Mixer m4 = m3.m1; m4.go();
Mixer m5 = m2.m1; m5.go();
}
void go() { System.out.print("hi "); }
}
Run Code Online (Sandbox Code Playgroud)
该行Mixer m3 = new Mixer(m2);调用一个不创建任何新对象的构造函数.那么,是不是没有创建新对象?
另外,哪个变量指的是程序末尾的哪个对象,即直到我们得到NullPointerExcetion变量m5.
Mic*_*rry 10
是 - 每次使用new(作为关键字)时,都会创建一个新对象.在这种情况下:
Mixer m3 = new Mixer(m2);
Run Code Online (Sandbox Code Playgroud)
线混合器m3 =新混合器(m2); 调用不创建任何新对象的构造函数.
你的推理是完全错误的.Mixer正在使用m2作为参数创建新的.通常这表示一个复制构造函数 - 创建一个具有与旧属性相同的属性的新混合器(但它始终是一个新的,不同的对象,并且在技术上不必复制传入的对象的属性.)
new 总是创建一个新实例(因此总是保留堆内存等)。
这应该说明一下。请注意,实例上的 == 会告诉您它是同一个实例(对象)还是不同的实例。(这就是为什么你应该总是使用 equals,除非这是你想要做的)
我添加了一个与字符串有关的有趣的事情。“abc”不会创建新实例,而是重用现有实例。但是当你在 String 类上调用 new 时,它就会发生。
public class Test {
private String value;
public String getValue() {
return value;
}
public Test() {
value = "default";
}
public Test(Test t) {
this.value = t.getValue();
}
public Test(String value) {
this.value = value;
}
public static void main(String[] argv) {
Test t1 = new Test();
Test t2 = new Test(t1);
if (t1 == t2) {
System.out.println("t1 == t2. should not happen");
} else {
System.out.println("t1 is a different instance from t2");
}
String s1 = "test";
String s2 = "test";
if (s1 == s2) {
System.out.println("s1 == s2. strings initialized with quotes don't always get a new instance.");
} else {
System.out.println("s1 is a different instance from s2. should not happen");
}
String s3 = new String("test");
String s4 = new String(s3);
if (s3 == s4) {
System.out.println("s3 == s4. should not happen.");
} else {
System.out.println("s3 is a different instance from s4, as they were newed.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10563 次 |
| 最近记录: |