日期:2014-05-18  浏览次数:20723 次

JAVA到底有没有引用传递???
最近复习《head first java》时候,看到书上写到:

在JAVA中所传递的所有东西都是值,但此值是变量所携带的值。引用对象的变量所携带的是远程空城而不是对象本身。

我感觉意思好像是在说:JAVA只存在值传递,根本不存在引用传递(和C++划分的特别清楚)。但是我在google上一搜,发现很多文章讲的都是”JAVA的值传递和引用传递..."这样的文章,于是就有了下面的疑问。

我个人理解是这样的:

对于JAVA来说,参数传值分为两种情况:
1. 基本类型:这个传值肯定是按照“值传递”来进行的,C/C++也是相同的,除非你指定int &这样的引用
2. 引用类型:这个就比较纠结了,因为你传值后,会复制一个引用到实参所指向的对象,你对对象的操作会同时影响实参和形参,那么,这个到底算是“值传递”还是“引用传递”呢?

疑问如下:
我们知道,“值传递”是不会影响到实参的。“引用传递”就相当于传递地址,其对引用对象的操作是实参/形参同时影响的。那么,在传递参数时传递一个引用,先复制一个引用指向实参对象,我个人理解这个复制操作符合“值传递”的概念,但是复制后,对指向对象的操作又会切实改变实参指向的对象,这明显是“引用传递”的特征。然后,我就傻傻分不清楚了。。。。。

求对这方面有深刻认识的高手解答,谢谢~
JAVA 值传递 引用传递

------解决方案--------------------

传递     传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址

             基本类型的栈 是它的本身. 传递时.传递的是本身的副本.所以对副本修改原响不了本身
             引用类型的栈 是一个内存地址.传递时..传递的是内存地址的副本..原内存地址与副本都指向同一内存. 所以.修改副本指向内存的内容时.会影响到原内存地址指向的内存
             基本类型进行传递的时候是值的 副本,基本类型的副本是一个栈(栈内存里存的是基本类型的本身),所以对栈的副本进行修改不会影响原件
             引用类型进行传递的时候是值的 副本,引用类型的副本是一个内存地址(栈),所以副本和原件都是都指向同一块内存堆空间