随便写写留着自己看。
首先,Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。
下面几个例子帮助理解。
例1:
先看一段代码:
1 public class Test2 { 2 String str = new String("good"); 3 String str1 = "wtf"; 4 int a = 10; 5 char[] ch = { 'a', 'b', 'c' }; 6 7 public static void main(String[] args) { 8 Test2 test2 = new Test2(); 9 test2.change(test2.str, test2.str1, test2.ch, test2.a); 10 System.out.println(test2.str); 11 System.out.println(test2.str1); 12 System.out.println(test2.a); 13 System.out.println(test2.ch); 14 } 15 16 public void change(String str, String str1, char[] ch, int a) { 17 str = new String("change ok"); 18 str1 = "change ok"; 19 ch[0] = 'g'; 20 a = 13; 21 } 22 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 good 2 wtf 3 10 4 gbc
分析:
可以看到String,int的值没有变,char[]数组中的值变了。为什么呢,简单画几个图来说明。
一、String
String是不可变类型,传递的是“good”在堆中的地址。
二、int
对于基本数据类型,传递的是值的一份拷贝,这份拷贝与原来的值没什么关系。
这个例子中,类变量a的值是10,没有改变,change方法中a的值由一开始的10变成了13。
三、char[]
类似于String中的before情况,不画了,传递的是堆中数组的引用(地址)。
指向的是同一个数组,所以ch[0]的值被改变了。
例2:
1 public class Test5 { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 int[] arr1 = { 1, 2, 3, 4, 5 }; 6 int[] arr2 = arr1; 7 arr2[1] = 16; 8 System.out.println("arr1=" + Arrays.toString(arr1)); 9 System.out.println("arr2=" + Arrays.toString(arr2)); 10 } 11 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
arr1=[1, 16, 3, 4, 5]
arr2=[1, 16, 3, 4, 5]
同样arr1和arr2指向的是同一个数组,所以改变一个的值另一个的值也就变了。
如果想将数组复制一份,那么应该声明、创建并初始化一个新的数组,然后将原数组中的元素挨个复制到新数组。