nas存储 java_Java是传值还是传引用?

(#)背景

最近收到以前学弟提出的疑问,就是java到底传的是引用还是值(按他的说法形参和实参),其实本来不像解释的,因为我觉得这是一个很简单的概念,当你看见的东西解释

不了的时候,你应该做的就是这些数据在java内存中的表现是什么呢,所以我给他的建议就是去看看这些在内存中都是什么样的,今天来自己解释一下吧

(#)例子

4e30ad85b6e3231e13e4dfcbc6b6add0.png

看了上面的小例子,首先你会觉得这个到底传的是什么呢?值好像也不全是,引用好像也解释不了,其实这个时候就很简单了,我们分析一下二者内存结构,

(1)对于int这种基本类型,我们知道它的存储模型是这样的,比如int a=0,是直接存储在栈里面的,而当我们调用t1()的时候,发生的是什么呢?

1b4509e7463a572c994d6ec45f1138e6.png

11713748c1d93668eb7d5f211ee8564c.png

会在栈中直接把a,b的值赋值给方法中使用的变量a,b,那么很明显你修改的a,b和main方法中的a,b并没有什么关系,这是第一种情况的原因

(2)对于String 类型,首先要说的就是String类型不是基本类型,那么我们String str="123"的时候,内存中发生了什么呢?来看看

ca0ff8392ea5cf8a75455f988bcc7831.png

那么我们调用t2()方法的时候,发生了什么呢,传递的是值嘛,那就很简单,我们直接把存储的值传进去了,而值是什么?很容易明白了吧

2c4eb4b90de86bca62bb3c724cb922ab.png

那么str="java"的时候发生了什么呢?

a717f4081151dc9d61044743b6096c8d.png

没错,str="java"其实相当于str=new String("java"),那么我们其实是在堆中重新分配了内存的,然后引用重新指向了新分配的内存,所以当然不影响外面了

(3)而同理对于t3方法,我们传进去的也是值,但是这个值就是在栈中存储的地址,流程图如下

966c1916ba568e90ee60fb327a658207.png

那么剩下来的就很好理解了,修改生效的原因就是因为二者指向了同一块堆内存,所以修改是正常的,那么举个例子,如果我在t3中再写一行当代,

t=new TestUrl();这样会影响到testUrl吗???想一想如果你能很快的想到内存中的样子,其实就明白java只传值,这句话是什么意思了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值