java中没有引用传递,只有值传递。
基本类型。
基本类型就不说了,值传递一眼就可以看出来,传递到方法中的基本类型变量都是变量在内存中的副本(就是我们说的形参),所以在方法中改变他们不会对外部变量造成影响。
方法中传递对象?
看下面的例子:
Items items1 = new Items();
test2(items1);
System.out.println(items1.getName());
public void test2(Items items){
items.setName("手机");
}
输出结果:手机
这个结果足以迷惑人让人认为这是引用传递了。
我们先来看看创建一个Items对象在内存中都做了什么:
Items items1 = new Items();
这个过程在内存中开辟了两块空间,堆空间中的new 对象,栈中存的向该对象的引用变量item1,同时存储着堆中对象的物理地址。
在以上函数的执行结果中,你可能认为方法中直接传入了item1变量,因为它里面存储的地址指向了new Items()对象,所以在函数执行完成后这个对象会发生改变。
这种理解是错误的!
我们再来看下面的例子:
在方法中修改对象的引用!
@Test
public void test() {
Items items1 = new Items();
Items items2 = new Items();
it(items1,items2);
System.out.println(items1);
System.out.println(items2);
}
public void it(Items items1,Items items2){
items1 = items2;
System.out.println(items1);
System.out.println(items2);
}
如果我们在上面的假设是正确的,那么这个函数打印的结果就应该是四个相同的引用值。
但是,程序的执行结果:
com.lishiqi.po.Items@3b95a09c
com.lishiqi.po.Items@3b95a09c
com.lishiqi.po.Items@6ae40994
com.lishiqi.po.Items@3b95a09c
在方法中我们改变了这个所谓的”引用传递”的引用,但是出了方法以后它还是打印原来的地址值。
我们来看看对象传入方法后内存中到底发生了什么:
实际上,方法中传入的items变量,是item1在栈内存中的一个副本,但是副本中存储的堆对象的地址是相同的,改变这个副本的引用不会改变实际item1变量的引用!
在方法中传递的引用类型变量,指向堆空间的地址是相同的,即值是相同的!所以仍然是值传递!