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变量的引用!

在方法中传递的引用类型变量,指向堆空间的地址是相同的,即值是相同的!所以仍然是值传递!