任何时候传入java方法的参数都是值传递, 如果是基本数据类型,直接把数据复制一份传入参数;如果传入的是对象的引用,则实际上复制的是对象在堆内存的地址,然后把这个地址值传入参数,而不是直接传入对象的引用 。请详细比较下面程序加不加注释后的区别:
public class ValuePastTest {
public void ChangeAppleName(Apple a){
a.setName("BBBBB");
// a = new Apple();
// a.setName("cccccc");
}
public static void main(String[] args) {
Apple a = new Apple();
a.setName("AAA");
System.out.println(a.getName());
System.out.println("after change name------");
ValuePastTest vpt = new ValuePastTest();
vpt.ChangeAppleName(a);
System.out.println(a.getName());
}
}
class Apple{
private String name;
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
其实没有区别,因为
a = new Apple();
a.setName("cccccc");
这里的a 指向另一个对象,在堆内存的地址已经不同了。
这个新的局部对象在方法结束之后被销毁。(GC适时回收)
关于这个值传递的内存分配情况,可以参考这里:
http://blog.csdn.net/zzp_403184692/article/details/8184751