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

分析:数组的传值本质时传地址值的副本。

 

posted @ 2017-07-25 15:59  XuGuobao  阅读(372)  评论(0编辑  收藏  举报