接上次的说 再来说说第二种情况,通过参数传递的。
public static main(String args[]){
Bean b=new Bean();
b.setName("abc");
change(b);
System.out.println(b.getName());
}
public static change(Bean b){
b.setName("cba");
}
结果:同样是 cba 原理同上次说的一样。
再来看另外一种情况:
public static main(String args[]){
Bean b=new Bean();
b.setName("abc");
change(b);
System.out.println(b.getName());
}
public static change(Bean b){
b=new Bean();
b.setName("cba");
}
结果 ;abc
解释:在change()方法里面 刚开始 是bean 将自己的引用复制了一份传入 change()方法,比如bean 的引用还是@123456 但是执行new Bean()之后 new操作符才 堆内存区域开辟了一个新单元地址@56789 然后把 @56789放入
形参 bean了。
一语中的: 参数传递的是引用的一个拷贝。在上次的参数传递的时候,传递的也是一个引用的拷贝,即拷贝了一个@12456放在栈内存的一个单元里。这次是拷贝完之后 并修改了栈内存单元里的值 使其指向一个新的堆内存地址。因为new 了。 没有new的话 就不会再堆内存中开辟新空间。所以上次的2个栈内存地址都指向一个堆内存。这次是2个栈内存地址指向2个堆内存。 这样的话 形参bean 再修改name的话,就是修改@56789里面的东西了。所以 实际的bean指向的@12345里面的东西没变。
愚见为此,敬请高手指点批评。