举3个范例:

1.引用传递,实例讲解1

package Nsbc.club;
 public class YinYong {
 public static void main(String[] args) {
 Demo d1 = new Demo();//实例化之后temp = 30;
 d1.temp = 50;//修改了temp的值,temp = 50;
 System.out.println("在调用fun()之前:" + d1.temp);
 fun(d1);//修改了temp的值,temp = 1000;
 System.out.println("在调用fun()之后:" + d1.temp);
 }
 public static void fun(Demo d2){
 d2.temp = 1000;
 }
 } class Demo{
 int temp = 30;//此处为了访问方便,属性暂不封装
 }

运行结果:

在调用fun()之前:50
在调用fun()之后:100

如下图:

2. 字符串的引用传递讲解2(重点)

public class YinYong1 {
 public static void main(String[] args) {
 String str = "nishuibaichuan";//实例化str对象
 System.out.println("在调用fun()之前:" + str);
 fun(str);
 System.out.println("在调用fun()之后:" + str);
 }
 public static void fun(String str1){
 str1 = "NISHUIBAICHUAN";
 }
 }

运行结果:

在调用fun()之前:nishuibaichuan
在调用fun()之后:nishuibaichuan

为什么是这样啊?不是说引用传递,传递的是地址嘛,这样的话,str和str1应该是指向同一对内存空间啊,那么在调用fun()之后输出应该为:NISHUIBAICHUAN  才对啊!但是输出的确是:nishuibaichuan !

至于为什么,现在笔者就来解释一下,字符串中的引用传递和其余2种引用传递(接口,数组)不太一样.

在前一篇文章(Java中的String类以及 == 和equals()方法的比较!

中笔者曾经说过,字符串的内容不可改变,实际上字符串内容的改变,并不是其内容真的改变了,而是内存空间的引用关系的改变.(注意:一个栈只能指向一个堆内存空间),

String str = "nishuibaichuan";//实例化str对象时开辟了一个堆内存空间,里面存放了"nishuibaichuan";所以在调用fun()之前输出为:nishuibaichuan;

当在fun()方法中传递引用时,str把地址传递给了str1,但是当执行str1 = "NISHUIBAICHUAN";时,str1断开了指向str处,自己开辟了一个内存空间(上一篇文章中说过一个字符串就是String类的匿名对象!),从而指向了 "NISHUIBAICHUAN";这时我们知道了str的值并没有改变,所以在调用fun()之后,str输出为:nishuibaichuan;

如下图:

3.引用传递,实例讲解3

public class YinYong3 {
 public static void main(String[] args) {
 Demo3 d1 = new Demo3();
 d1.temp = "baichuan";
 System.out.println("在调用fun()之前:" + d1.temp);
 fun(d1);
 System.out.println("在调用fun()之后:" + d1.temp);
 }
 public static void fun(Demo3 d2){
 d2.temp = "NISHUIBAICHUAN";
 }
 }  class Demo3{
 String temp = "nishui";
 }

运行结果:

在调用fun()之前:baichuan
在调用fun()之后:NISHUIBAICHUAN

以上结果是在大家意料之外还是意料之中啊,这里笔者解释一下运行结果为什么是这样:

分析以上代码,在上面2中,笔者说过,字符串的内容不可改变.

现在我们继续往下看main()中,main()中实例化了一个对象d1,我们在Demo3这个类中,我们已经定义了String类的对象temp = "nishui",而这个对象是属于Demo3这个类的.这时候就开辟了一个堆内存空间,同时并把这个堆内存空间地址传递给了这个对象d1,d1指向了temp = "nishui".

当d1.temp = "baichuan";时,由于字符串的内容不可改变,实际上字符串内容的改变,并不是其内容真的改变了,而是内存空间的引用关系的改变.

一个栈只能指向一个堆内存空间,于是d1本来是指向temp = "nishui".就断开了指向,这时就指向了temp = "baichuan";于是当输出在调用fun()之前的值就为:baichuan;

这时,执行到fun(d1);因为Demo3并非字符串,所以他的内容可变,于是就把d1的地址赋值给了d2,当在调用fun()之后就修改了temp的值,于是最后就输出了:NISHUIBAICHUAN;