看看下面几个引用传递的例子:
范例1:
- package org.reference;
- class Demo{
- int temp = 10;
- }
- public class ReferenceDemo {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Demo d1 = new Demo();
- d1.temp = 50;
- System.out.println("调研fun方法之前d1.temp=" + d1.temp);
- fun(d1);
- System.out.println("调研fun方法之后d1.temp=" + d1.temp);
- }
- public static void fun(Demo d2){
- d2.temp = 1000;
- }
- }
结果:
调研fun方法之前d1.temp=50 调研fun方法之后d1.temp=1000 |
本范例中,fun方法接收了Demo对象d1,并对temp的值进行了修改,应为是引用传递,所以最好的值为1000.
范例2:
- package org.reference;
- public class ReferenceDemo02 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- String d1 = "WORLD";
- System.out.println("调研fun方法之前d1=" + d1);
- fun(d1);
- System.out.println("调研fun方法之后d1=" + d1);
- }
- public static void fun(String d2){
- d2 = "HELLO WORLD!";
- }
- }
结果:
调研fun方法之前d1=WORLD 调研fun方法之后d1=WORLD |
由程序结果可以知道,fun方法并没有使得值改变,这是应为字符串的内容一旦声明了就不可以在进行改变,改变的只是内存地址的指向。
范例3:
- package org.reference;
- class Demo01{
- String temp = "HELLO";
- }
- public class ReferenceDemo03 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Demo01 d1 = new Demo01();
- d1.temp = "WORLD";
- System.out.println("调研fun方法之前d1.temp=" + d1.temp);
- fun(d1);
- System.out.println("调研fun方法之后d1.temp=" + d1.temp);
- }
- public static void fun(Demo01 d2){
- d2.temp = "HELLO WORLD!";
- }
- }
结果:
调研fun方法之前d1.temp=WORLD 调研fun方法之后d1.temp=HELLO WORLD! |
由结果知道,这个范例中的fun方法使得结果发生了改变,和范例1中的结果完全是类似的,这里操作的同样是字符串,为什么会不一样呢?其实这里是不相同的,因为这里的String是属于Demo01类的一个属性,而操作的时候更改只是Demo类的属性内容。这样可能并不完全理解,看了下面的三个内存分析图就可以很清楚的明白了。
图(1)对应范例1:
图(2)对应范例2:
图(3)对应范例3: