看看下面几个引用传递的例子:

范例1:

 
  1. package org.reference;  
  2.  
  3. class Demo{  
  4.     int temp = 10;  
  5. }  
  6.  
  7. public class ReferenceDemo {  
  8.  
  9.     /**  
  10.      * @param args  
  11.      */ 
  12.     public static void main(String[] args) {  
  13.         // TODO Auto-generated method stub  
  14.         Demo d1 = new Demo();  
  15.         d1.temp = 50;  
  16.         System.out.println("调研fun方法之前d1.temp=" + d1.temp);  
  17.         fun(d1);  
  18.         System.out.println("调研fun方法之后d1.temp=" + d1.temp);  
  19.     }  
  20.     public static void fun(Demo d2){  
  21.         d2.temp = 1000;  
  22.     }  
  23.  
  24. }  

结果:

调研fun方法之前d1.temp=50
调研fun方法之后d1.temp=1000

本范例中,fun方法接收了Demo对象d1,并对temp的值进行了修改,应为是引用传递,所以最好的值为1000.

范例2:

 
  1. package org.reference;  
  2.  
  3. public class ReferenceDemo02 {  
  4.  
  5.     /**  
  6.      * @param args  
  7.      */ 
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         String d1 = "WORLD";  
  11.         System.out.println("调研fun方法之前d1=" + d1);  
  12.         fun(d1);  
  13.         System.out.println("调研fun方法之后d1=" + d1);  
  14.     }  
  15.     public static void fun(String d2){  
  16.         d2 = "HELLO WORLD!";  
  17.     }  
  18.  
  19. }  

结果:

调研fun方法之前d1=WORLD
调研fun方法之后d1=WORLD

 

由程序结果可以知道,fun方法并没有使得值改变,这是应为字符串的内容一旦声明了就不可以在进行改变,改变的只是内存地址的指向。

范例3:

 
  1. package org.reference;  
  2.  
  3. class Demo01{  
  4.     String temp = "HELLO";  
  5. }  
  6.  
  7. public class ReferenceDemo03 {  
  8.  
  9.     /**  
  10.      * @param args  
  11.      */ 
  12.     public static void main(String[] args) {  
  13.         // TODO Auto-generated method stub  
  14.         Demo01 d1 = new Demo01();  
  15.         d1.temp = "WORLD";  
  16.         System.out.println("调研fun方法之前d1.temp=" + d1.temp);  
  17.         fun(d1);  
  18.         System.out.println("调研fun方法之后d1.temp=" + d1.temp);  
  19.     }  
  20.     public static void fun(Demo01 d2){  
  21.         d2.temp = "HELLO WORLD!";  
  22.     }  
  23.  
  24. }  

结果:

调研fun方法之前d1.temp=WORLD
调研fun方法之后d1.temp=HELLO WORLD!

 

由结果知道,这个范例中的fun方法使得结果发生了改变,和范例1中的结果完全是类似的,这里操作的同样是字符串,为什么会不一样呢?其实这里是不相同的,因为这里的String是属于Demo01类的一个属性,而操作的时候更改只是Demo类的属性内容。这样可能并不完全理解,看了下面的三个内存分析图就可以很清楚的明白了。

图(1)对应范例1:

图(2)对应范例2:

图(3)对应范例3: