Java是传值还是传引用?

(#)背景 

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

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

(#)例子

 

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

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

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

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

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

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

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

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

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

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

posted @ 2017-04-06 18:56  nasjjsadkef  阅读(290)  评论(0编辑  收藏  举报