为什么这个java应用程序打印“true”?
这是我的第一节课你好。爪哇
public class Hello {
String name = "";
}
这是我的二级测试1。爪哇
public class Test1 {
public static void main(String[] args) {
Hello h = new Hello();
Test1 t = new Test1();
t.build(h);
System.out.println(h.name);
}
void build(Hello h){
h.name = "me";
}
}
当我运行Test1时。java,它打印“我”。我想我明白了,因为“转介”
这是我的第三级测试2。爪哇
public class Test2 {
public static void main(String[] args) {
Hello h = null;
Test2 t = new Test2();
t.build(h);
System.out.println(h == null);
}
void build(Hello h){
h = new Hello();
}
}
当我运行Test2时。java,它打印“真”,为什么?不再是“参考转移”了吗?我很困惑
# 1 楼答案
h.name = "me"
更改h
引用的对象。此更改将在引用同一对象的任何其他位置可见h = new Hello()
使h引用另一个(新)对象。此更改仅影响该特定变量h,而不影响之前引用同一对象的任何其他变量# 2 楼答案
Java总是通过值传递。当有引用时,它只传递指向同一对象的引用副本。在这种情况下,你只是复制了另一个对象。这就是为什么你原来的那个没有改变
# 3 楼答案
您可能知道,Java是按值调用的。当你传递一个引用时,引用会被复制。可以肯定的是:引用本身和而不是引用的目标会被复制
让我们看一下您的第一个示例:调用
build()
时,将复制引用h
。因为h
(在build()
中的副本)不会被build()
中的某个地方覆盖,所以它总是指向原始h
的内存位置。所以改变h.name
会影响原始的h
示例2不同:引用
h
也会被复制。但是h
在build()
中被覆盖。结果是原始的h
和build()
中的h
指向不同的内存位置!build()
中的h
指向新生成的Hello
对象,在返回方法build()
后的某个时候,该对象将被垃圾收集# 4 楼答案
在测试1中。java,当您将
Hello
objecth
传递给build()方法时,变量main().h
和build().h
指向内存中的同一个对象即
main().h = build().h => pointing same object
但是在测试2中。java,即使您将
main().h
传递给build()方法,但稍后在build方法内部,您将build().h
重新初始化到一个新对象。但这并不影响main().h
它们都指向不同的物体
这就是为什么
main().h
仍然包含null
并且您的程序打印为true# 5 楼答案
你有两个不同的变量
h
。第一个是main
本地的。第二个是build
本地的如果将
build
变量重命名为x
,那么main
中的h
不受影响的原因就显而易见了编辑:
在这里你可以清楚地看到,
x
以null
开头。然后x
成为一个新对象。然后x
死亡h
对x
的生活一无所知# 6 楼答案
Mybe这就解释了为什么:http://www.yoda.arachsys.com/java/passing.html