先下结论:传入基本类型是传值,传入对象是传引用
网上看到有人说java是传值,论据如下
在java中只有一种传递方式,那就是值传递.可能比较让人迷惑的就是java中的对象传递时,对形参的改变依然会影响到该对象的内容。
下面这个例子来说明java中是值传递.
public class Test {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("hello ");
getString(sb);
System.out.println(sb);
}
public static void getString(StringBuffer s) {
//s = new StringBuffer("ha");
s.append("world");
}
}
在上面这个例子中,当前输出结果为:hello world。这并没有什么问题,可能就是大家平常所理解的引用传递,那么当然会改变StringBuffer的内容。但是如果把上面的注释去掉,那么就会输出:hello.此时sb的值并没有变成ha hello. 假如说是引用传递的话,那么形参的s也就是sb的地址,此时在方法里new StringBuffer(),并将该对象赋给s,也就是说s现在指向了这个新创建的对象.按照引用传递的说法,此时对s的改变就是对sb的操作,也就是说sb应该也指向新创建的对象,那么输出的结果应该为ha world.但实际上输出的仅是hello.这说明sb指向的还是原来的对象,而形参s指向的才是创建的对象,这也就验证了java中的对象传递也是值传递。
首先纠正几点
1. 形参s是对变量sb的复制,修改s不会对sb有影响,只是s和sb都指向同一个对象1(地址:0x00000001,值为hello),所以修改s也会修改sb所指向的对象。
2. 进行s = new StringBuffer(“ha”);操作后,为什么sb依旧为hello,而不是ha world,那是因为赋值操作,使变量s所指向一个新的对象2(地址:0x00000002,值为ha),而sb还是指向对象1,所以后面s.append(“world”)操作是修改对象2的内容,对象1不变。最后打印对象1,当然结果是hello。