Java只有值传递,但传递的是引用,类似C/C++中的指针。
往容器里添加引用类型数据
将一个引用装入容器时,若外部程序对该引用指向的内容作了修改,那么容器里的内容也会改变。也就是说将一个引用类型变量加入到容器中,实际上还留了个“指针”在外部,通过对“指针”所指内容的修改会造成容器里内容的改变,这点需要格外注意。
因此往容器中添加元素时,添加不同的元素要使用不同的引用。
举例说明:
List<StringBuilder> list=new ArrayList<>();
StringBuilder sb=new StringBuilder("abcd");
list.add(sb);
sb.setCharAt(0,'e');
list.add(sb);
sb.setCharAt(1,'f');
list.add(sb);
sb.setCharAt(2,'g');
list.add(sb);
System.out.println(list);
程序输出:
[efgd, efgd, efgd, efgd]
setCharAt()对引用指向的内容作了修改,则list内的内容也会跟着改变。list包含4个元素,但这四个元素(引用类型)都指向了内存中的同一个地方,引用指向的内容最后被修改成了"efgd",因此4个元素值都是efgd。
引用类型作为函数参数
当引用类型变量作为函数参数时,在函数体内只能对引用指向的内容做修改,而不能给这个引用类型变量重新赋值。因为Java传参传递的是引用,给这个引用类型变量重新赋值后,它就指向了其它地方。