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只传值,这句话是什么意思了

时间: 2024-08-06 14:54:31

Java是传值还是传引用?的相关文章

【转载】Java是传值还是传引用

1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = &q

Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题: Is Java “pass-by-reference” or “pass-by-value”? 翻译成中文: Java是传值还是传引用? 请先不要看下面的内容,思考10秒后,在继续阅读!!! 为什么建议先思考,在阅读内容呢? 我们每天可能会利用碎片化的时间阅读很多内容,有很多信息和知识其实在大脑

Java中传值和传引用

今天看了Java中的传值和传引用,对于这一块开始的时候不太能理解,通过查阅其他几篇blog,将自己的理解记录下来: 比较好的几篇blog:http://blog.csdn.net/houpuhope/article/details/7449377; 首先对于传值和传引用需要有一个初步的理解就是,通过传值的方式传进来的参数修改了,对原变量并没有什么影响: 而,通过传引用的方式修改的,原变量值也跟着改变.下面进行详细的解析: 1.对于基本类型Java是按照传值传递的: public class Te

Java:传值还是传引用?

这是一个Java的经典问题,大部分人从C,C++语言入门,C语言有三种传递方式:值传递,地址传递和引用传递.详细的对C语言指针,引用的我个人的理解,见链接. Java所有操作都是传值操作!都是传值操作!都是传值操作!重要的事情说三遍. 疑问?那为什么别人讲的时候都是说,java的基本数据类型都是传值,所有的自定义数据(类的对象)都是传引用?? 很简单,因为这样好理解,意思是说:"同学们,如果我们把一个基本数据类型的值(变量)传递给一个函数的形参,那么无论我们对这个变量怎么操作,函数运行完之后,并

Java是传值还是传引用

http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html Java 方法的参数是简单类型的时候,是按值传递的 (pass by value) eg.b="llobe"; 等价于b=new String ("love"); java传递的是引用的拷贝,即不是引用本身,更不是对象.

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中. 在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享. 以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的.不过现在我觉得不是这样的. *****************************************************

Java传值与传引用

在Java中,变量分为以下两类, 1.对于基本类型变量,Java是传值的副本,即时自己的副本变了,自己也不会变化. 2.对于一切对象型变量,Java都是传引用的副本,也就是复制指向地址的指针,它传的引用副本指向自己的地址. eg:你要张三(张三相当于函数)打开仓库,并检查库里面的货物(仓库相当于地址),有必要新建一座仓库(并放入相同的货物)给张三吗? 没有必要,你只需要把钥匙(引用)复制一把给张三即可, 张三会拿复制的钥匙(引用副本,但是有时效性,函数结束,钥匙销毁)打开仓库. 注意:Strin

java传递参数是传值还是传引用

这个问题,网上一查越看越迷糊,纠结完了先总结下 先看个栗子: 1 public class Example { 2  3     public void change(String str1, StringBuffer sbr1, char[] ch1, int a) { 4         str1 = "world"; 5         sbr1.append("world"); 6         ch1[0] = 'g'; 7     } 8  9    

Java经典问题:传值与传引用?

转自:http://developer.51cto.com/art/201104/254715.htm Java到底是传值还是传引用?相信很少有人能完全回答正确.通常的说法是:对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数组),传引用.基本类型传值,所有人都不会对此有疑义;问题出在引用类型上. 为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛? /** * @(#)Swap.java * * *  @author *  @version  1.00