关于值传递和引用传递的一点点疑惑。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
他给的答案是:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的
小弟不太明白,好像和自己对值类型与引用类型的理解不太一样,请熟悉这个的人给解释一下好么?
感谢中。晚上结贴。
问题点数:100、回复次数:16Top
1 楼malligator(十步之内没有我的爱人)回复于 2006-12-01 12:32:21 得分 5
对象参数传的是地址的拷贝(它指向同一个内存单元)而不是地址本身,用=只改变拷贝的指向,没有改变本身:通过=给对象引用赋值都是徒劳的
只能通过类封装好的方法改变其内容(改的是它指向的内存)
Top
2 楼zeroasan_()回复于 2006-12-01 12:35:13 得分 20
确实java只有值传递
不过我总觉得这样讲有些误导人的嫌疑。
其实参数传递,传递的只有两种形式的参数,一种是基本类型参数,一种对象参数。
基本类型传递的是数值,而对象传递传的是对象引用值。所以说java只有值传递。其实这个概念被强调应该是区别于c++的。
其实很简单的一个概念,初学者最早理解基本都是正确的,却被“只有值传递”弄糊涂了Top
3 楼For_suzhen(不懂装懂)回复于 2006-12-01 12:55:13 得分 2
引用Top
4 楼liuzhongsheng1984()回复于 2006-12-01 13:00:07 得分 2
就像遥控器和电视的关系一样
传的是遥控器的copy,但是这个copy还是可以操作那台电视的。Top
5 楼theforever(碧海情天)回复于 2006-12-01 14:54:48 得分 1
楼上的比喻很形象Top
6 楼jicken_woo(黑夜里你留下的轮廓,指引我-------不寂寞---------------)回复于 2006-12-01 15:15:45 得分 1
学习学习。。。Top
7 楼sxnucseven(*)回复于 2006-12-01 15:16:42 得分 2
这像是文字游戏,可以尽量的去绕过这些名词去理解真正的执行过程。这样会好些。Top
8 楼syoumei(良匠不择器)回复于 2006-12-01 15:24:27 得分 2
今天这板块第4个这类问题了
100分诱惑有点
不过我忍了
劝君多看结账贴Top
9 楼yslf8517()回复于 2006-12-01 17:47:36 得分 10
我感觉,之所以Java 声称只有值传递参数,没有引用传送的原因是:还是为了区别C++中的指针,维护自己据说的JAVA中没有指针引用。
这样话,当对象作为参数进去后,它让我们理解传的只是一个引用,把这个引用当个值,可能是一个内存地址值,这样话在里面所作的修改,都可能影响到这个对象的具体属性。
不知道,你是否明白了?Top
10 楼AWUSOFT(程序设计,一个字:爽!)回复于 2006-12-01 17:57:44 得分 35
这样给你解释看看吧....
A a;这里定义一个变量
a=new A();这里把创建的对像的内存首地址给它,所说a变量的值只是一个地址值.
当传参数的时候
public void s(A b)
{
}
这时候也是创建一个变量b,然后把变量a的值(地址值)给b,所以b和a就是引用了同个对像,因为它们的值是同一个地址值.
所以说是传"值"-------------->地址值
但是它们都是指向同一个对像(因为地址值相同)-----这就产生了引用传值的说法.Top
11 楼marckle(小马哥)回复于 2006-12-01 18:13:02 得分 2
赞同zeroasan_(),我觉得他已经说得很清楚了。
Top
12 楼aniude(重返荣耀)回复于 2006-12-01 18:33:11 得分 4
通常来说值传递不会占用太多的内存空间,但是传递对象时如果用值传递的话一般来说会占用很多的内存,那么选择引用传递是比较合理的。Top
13 楼aniude(重返荣耀)回复于 2006-12-01 18:34:37 得分 2
by the way,100分真的有点诱惑 :)Top
14 楼schumiXsuse(我记住了名字,却忘记了密码)回复于 2006-12-01 23:52:11 得分 7
楼主看这里:
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
他给的答案是:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的
------------------------------------------------------------------------------------
首先要声明,JAVA中只有值传递,没有地址传递。
然后我们来看,JAVA中对象分为两种,一种是基本类型,另一种是引用类型。基本类型是值传递这个没什么好说的;引用类型则麻烦一点,我们来看个例子:
class ReferObj
{
private int arr =0;
ReferObj(int i)
{
this.arr = i;
}
public void setArr(int i)
{
this.arr = i ;
}
public String toString()
{
return this.arr;
}
}
public class Test
{
void modifyArr(ReferObj obj , int i)
{
obj.setArr(i)
}
void modifyObj(ReferObj obj , int i)
{
obj = new ReferObj(i);
}
public static void main(String[] args)
{
Test test = new Test();
ReferObj obj = new ReferObj(1) ;
test.modifyArr(obj ,2);
test.modifyObj(obj ,3);
System.out.print(obj);
}
搂主说,这段程序会打印什么呢?呵呵,当然是2。
这是因为在JAVA中,初始化一个引用类型的变量会初始化两个变量,一个引用,一个对象本身,在JAVA中传递的实际上是引用的COPY,也就相当于引用的值传递,所以在程序中你能改变的只是引用指向的对象的属性,而不能改变引用的指向。
Top
15 楼AWUSOFT(程序设计,一个字:爽!)回复于 2006-12-01 23:55:52 得分 0
--如果明白了请结贴,你的结贴是我回贴的最大动力Top
16 楼meconsea(罂粟(mecon))回复于 2006-12-02 10:50:27 得分 5
http://blog.csdn.net/meconsea/archive/2005/03/23/327294.aspxTop





