一、无论JAVA参数的类型是什么,一概传递参数的副本。html
二、变量分为两类:对于基本类型变量,传值的副本;对于一切对象型变量,传引用的副本。数组
三、传引用副本的实质就是复制指向地址的指针。spa
四、须要注意的是,String类型也是对象型变量,因此它必然是传引用副本。只不过String是一个非可变类,使得其传值仍是传引用显得没有什么区别。指针
五、对基本类型而言,传值就是把本身复制一份传递,即便本身的副本变了,本身也不变;而对于对象类型而言,它传的引用副本(相似指针)指向本身的地址,而不是本身实际值的副本,而不是采用复制对象值的方法。code
六、具体例子,请看本人博客http://www.cnblogs.com/XuGuobao/p/7233137.htmlhtm
七、实例对象对类的属性的做用:对象
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 }
输出结果为:blog
p1.age = 20
p2.age= 30get
分析:当从新new对象时,所用的属性仍然时原始值。博客
八、
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的值,而不改变原对象的值。
九、数组的引用传递
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
分析:数组的传值本质时传地址值的副本。