Java引用传递之二
1、不管JAVA参数的类型是什么,一律传递参数的副本。
2、变量分为两类:对于基本类型变量,传值的副本;对于一切对象型变量,传引用的副本。
3、传引用副本的实质就是复制指向地址的指针。
4、需要注意的是,String类型也是对象型变量,所以它必然是传引用副本。只不过String是一个非可变类,使得其传值还是传引用显得没有什么区别。
5、对基本类型而言,传值就是把自己复制一份传递,即使自己的副本变了,自己也不变;而对于对象类型而言,它传的引用副本(类似指针)指向自己的地址,而不是自己实际值的副本,而不是采用复制对象值的方法。
6、具体例子,请看本人博客http://www.cnblogs.com/XuGuobao/p/7233137.html
7、实例对象对类的属性的作用:
1 class Person01{ 2 int age = 30; 3 } 4 5 public class RefDemo04 { 6 7 public static void main(String[] args) { 8 Person01 p1 = new Person01(); 9 p1.age = 20; 10 System.out.println("p1.age = "+ p1.age); 11 Test(); 12 } 13 public static void Test(){ 14 Person01 p2 = new Person01(); 15 System.out.println("p2.age= " + p2.age); 16 } 17 }
输出结果为:
p1.age = 20
p2.age= 30
分析:当重新new对象时,所用的属性仍然时原始值。
8、
1 class Value{ 2 public int i = 15; 3 } 4 5 public class Test { 6 7 public static void main(String[] args) { 8 Test t = new Test(); 9 t.first(); 10 } 11 12 private void first() { 13 int i = 5; 14 Value v = new Value(); 15 v.i = 25; 16 second(v,i); 17 System.out.println(v.i); 18 } 19 20 private void second(Value v, int i) { 21 i = 0; 22 v.i = 20; 23 Value val = new Value(); 24 v = val; 25 System.out.println(v.i + " " + i); 26 } 27 }
输出结果为:
15 0
20
分析:对象v也是传一份引用的副本,v.i = 20;通过引用的副本改变原对象的值为20,但在语句Value val = new Value();中,new了一个新对象,然后执行v = Val;相当于引用的副本指向了一个新的Object。所以v.i = 15是改变新的Object的值,而不改变原对象的值。
9、数组的引用传递
1 public class Test01 { 2 3 public static void main(String[] args) { 4 char ch[] = {'n','g','e','t'}; 5 chage(ch); 6 System.out.println(ch); 7 } 8 9 private static void chage(char[] ch) { 10 ch[0] = 'c'; 11 } 12 }
输出结果为:cget
分析:数组的传值本质时传地址值的副本。