日期:2014-05-20  浏览次数:20754 次

大家来讨论下java中的值传递和引用传递~
今天看到了一道题:
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
我的理解是引用传递。
但是我是基于以前看视频学到的一个例子来判断的,例子如下:
比如定义一个方法 
void change(int a){
 a=3;
}

当你定义一个变量int b=10;并且把b传进change方法中后,b的值是不会改变的。因为在change方法中对传入的参数进行了一个拷贝,我们所改变的是那个拷贝的值而不是原来的值。
假如参数不是int a,而是传入某个对象引用,然后在方法中对该对象进行修改,则原来的对象会发生改变,因为该方法对传入的对象进行了拷贝,但是拷贝出来的对象引用还是引用了原来的对象,所以对其进行改变,原来的对象也会改变。
基于上面的这个实例(这个实例是我看视频总结出来的,不知道是否完全正确,如果有错误请指正~),我认为题目答案应该是引用传递,不知道我的这个思路对不对,大家来讨论讨论呗。
我在网上看到的答案是值传递。
------解决方案--------------------
赞同楼主的观点,是引用传递。java中原始类型是值传递,复杂类型是引用传递。坐等大神更详细的解答
------解决方案--------------------
你的主贴中的理解是对的。

int 那个是值传递。 
------解决方案--------------------

我记得Java编程思想中是Java都是值传递;
说Java是值传递没错;
说Java既有值传递,也有引用传递,也有一定的道理,因为这个引用传递也属于按值传递,只不过这个”值“是个地址;
看一下这篇文章,你应该会懂的;
http://blog.csdn.net/jiangnan2014/article/details/22944075
------解决方案--------------------
java中的基本数据类型,是被存放在所谓的栈中。而其他的则是存放在堆中,在栈中有个值指向堆中的数据,
我们在操作时是操作的栈中的数据,基本类型就还是以前的值,而其他对象则只是引用,这个引用自然也是值了
------解决方案--------------------
嗯,你帖子中分析的有道理,但是仅从Java的角度来讲,Java中只有值传递,基本类型传的是值本身。复杂,对象类型传递的是指向堆内存中的引用,传递的是引用的地址,也是实际的值。如果硬是叫它为引用也没有错。当你改变传入的引用对象的值时,其实改变的是指向的堆内存的内容。其实传递过来的引用值,是没有变化的,我们之所以看到变化了,是因为程序通过传进来的引用值,去改变了对应的堆内存中的对象内容,当返回原来的引用值时,还是指向原来的堆内存内容,但是此时内容已经改变了。
------解决方案--------------------
Java都是值传递,分两种:传递常量值(8种基本数据类型和字符串) ,传递引用值(对象)
------解决方案--------------------
引用:
Java都是值传递,分两种:传递常量值(8种基本数据类型和字符串) ,传递引用值(对象)
String传得是指针。。可以用这个指针发射修改String值。
------解决方案--------------------
引用:
Quote: 引用:

Java都是值传递,分两种:传递常量值(8种基本数据类型和字符串) ,传递引用值(对象)
String传得是指针。。可以用这个指针发射修改String值。
指针是C++里的,Java里用引用代替指针。我和楼主的观点一样:传引用方式。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Java都是值传递,分两种:传递常量值(8种基本数据类型和字符串) ,传递引用值(对象)
String传得是指针。。可以用这个指针发射修改String值。
指针是C++里的,Java里用引用代替指针。我和楼主的观点一样:传引用方式。
在Java中的引用类型,是指除了基本的变量类型之外的所有类型,所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失), 基本的变量类型只有一块存储空间(分配在stack中), 而引用类型有两块存储空间(一块在stack中,一块在heap中)
引用是引用 指针是指针,java的引用 等同 C的指针 ,若仅仅是考虑java引用 而不用指针这个 词 ,引用定义就要变了,1. 引用是一种数据类型,保存了对象在内存中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象);

2. 不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,即该类类型的变量。而这两条特征 在C里完全是指针具备而引用不具备的。
------解决方案--------------------
如果能把引用抽象成一种值的话,那么只有值传递;
由于引用是一个地址,所以可以有值的特征,那么就姑且认为是值传递吧。
其实楼主不必纠结,看你的贴,你是会使用这些传递的;究竟是引用还是值就留给那些语言学家去操心吧!
------解决方案--------------------
你明白了就好,怎么说无所谓
------解决方案--------------------
引用传递。

顶12楼,那种蛋疼的争论留给蛋疼的人,只要写出东西来正确就行了,管他到底是什么传递