如果是int myMethod(Integer i)呢? 这里的i是Integer类的一个实例(一个对象),myMethod得到的不再是i的一个拷贝,而是i的地址的一个拷贝。这时,如果myMethod改变了i,调用者手里的i也跟着变了,因为两者的i都是相同的地址,指向同一个Integer对象。
由此看来,有人说java里primitive是“pass by value”而对象是“pass by reference“是不对的,java永远是pass by value,就是java只会传拷贝,只不过传primitive的时候拷贝的是参数值,传非primitive的时候拷贝的是对象的地址。如果你学过C++,可以比较一下myMethod(Integer i)和C++里的myMethod(int& i)看有什么不同。注意int[]是按“非primitive”传的,就是说传的是数组的地址。显然,java这种设计是出于效率的考虑。如果把整个对象拷贝一次或把整个数组拷贝一次多浪费,还是说,“哎,那个对象的地址在这儿,要玩自己去玩吧”省事。而primitive呢,还是传拷贝比较省事。就几个字节嘛,有的还不如一个地址长呢。何况这几个字节是在栈(stack)里传的,而给了地址还要按地址到堆(heap)里去找。这两者各有各的用处,有的时候我们非要传地址不可(哪些时候? 你自己想想,想不出再来问),所以才发明了Integer、Boolean、Double这些类,还在里面加上了和字符串互相转换的功能,很好。
但显然,能用primitive的时候不用非primitive。
在Java的方法调用中,方法中的参数是以传值的形式进行的,不管它是什么数据类型。如果是基本数据类型,则就是传入该值的一个拷贝;如果是类类型,则传入的是引用的一个拷贝。归根结底还是传的值。出处