java 函数参数_Java函数参数传递

到底是传值 or  传引用(传地址)

结论:

1、基本数据类型作为参数传递时,是值得拷贝,无论你是怎么修改这个拷贝的,原来的值是不是被改变的。

2、对象作为参数传递时,其实是把对象在堆内存的中的地址拷贝了一份传给了参数。

一、基本类型作为参数传递

测试1:

a7493151875a1e503702c9096a467e59.png

结果:

91e2744d5ffb9dd64f5ad037440cfe82.png

所以可以看出,基本类型作为参数传递时,是传递值得拷贝,无论你是怎么修改这个拷贝,原值是不会改变的。

二、对象作为参数传传递

测试2:

aa59159ee05cc595674c06029318ca48.png

结果:

83d4201c686a7cef2bb76c69c1e620ae.png

可以看到值被修改了,那么是不是意味着传递的不是值得拷贝,而是值得本身?

其实不然的,我们可以再测试第三个例子

测试3:

5f52196476d7c1510c57d5796314f497.png

结果:

ce92c08a6548e68e151ec14e4e0fe2e1.png

可以看出居然sb的值不变,这就可以推断出,我们传递的对象其实并不是对象本身,而是一个地址的拷贝,而是类似了C里面的指针,多个指针同样指向了一块内存,就可以对其进行操作了。

我们以一个图来看看

StringBuffer sb = new StringBuffer("Hello ");

执行完后,就会在堆内存中开辟一个存储sb对象的地址,如图:

614aaba90ce1ca37a318664f45cb8f15.png

sb 是一个引用,里面存放的是一个地址 "@3a"

然后执行

changeData(sb);

就把sb传递给了changeData方法中的StringBuffer strBuf 。由于sb存放的是地址,所以strBuf也将存放相同的地址,如图:

4f01020a7a599281a4e6af86ba0f772f.png

此时的,sb和strBuf由于存放的内存地址相同,都指向了 "Hello"

strBuf.append("World!");

执行changeData方法中的这一句后,改变了strBuf指向的内存中的值,如下图3所示

ce873018b77cf2f8e3ae6d38541dc20d.png

所以在测试2里面会输出

修改后sb = Hello World!

但是在测试3里面又做了一步

strBuf = new StringBuffer("World");

这一步相当于在内存中另外开辟的一个StrBuf的存储空间,strBuf由原来指向 "Hello",有重新的指向了 “liuzeyu12a”(“Hi”)

02456abaff0f81b1981decc8f405ba2e.png

所以当执行完

strBuf.append("World!");

fc327ddd98f3983a0b0a931f8a917154.png

通过上面的比较,就会很清楚的发现,由于sb 和strBuf中存放的地址不一样了。所以当strBuf指向

的内存值发生改变了,但sb 指向的内存值并不会改变,因此测试3输出了

修改前sb=Hello

修改后sb=Hello

--------------------------------

综上所述,我们就会明白,在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数。

参考资料:https://www.cnblogs.com/hpyg/p/8005599.html

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值