这是我的第一个Hello.java类
public class Hello {
String name = "";
}
Run Code Online (Sandbox Code Playgroud)
这是我的第二个Class Test1.java
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";
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行Test1.java时,它会打印"我".我想我理解,因为"参考转移".
这是我的第三个Class Test2.java
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行Test2.java时,它打印"true",为什么?是不是"参考转移"?我很迷惑.
您可能知道,Java是按值调用的.Wenn你传递了一个引用,该引用被复制了.可以肯定:引用本身而不是引用的目标被复制.
我们来看看您的第一个示例:调用时build()
,h
将复制引用.因为h
(副本build()
)不会被覆盖在某处build()
,它总是指向原始的内存位置h
.所以变化h.name
会影响原作h
.
示例2不同:引用也h
被复制.但h
被覆盖了build()
.其效果是,原来h
和h
中build()
指向不同的内存位置!的h
在build()
指向新生成的Hello
对象,这将在垃圾方法的返回后somewhen收集build()
.
归档时间: |
|
查看次数: |
305 次 |
最近记录: |