Java中的引用传递及其使用

举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

如下图:

QQ截图20150811115706

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()方法的比较!

原文地址:http://blog.csdn.net/u012759397/article/details/47387985)

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

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

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

如下图:

QQ截图20150811185653

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;

如下图:

QQ截图20150811210554


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值