举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;