当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
用google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是“值传递”呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。
问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。
一,认为是值传递。得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容”,这句话可能有些费解,举个例子加以说明。
public class Paier {
public static void main(String[] args) {
Paier paier = new Paier();
paier.test();
}
public void test() {
TestClass para1 = new TestClass();
para1.setTest(new Integer(10));
TestClass result1 = test1(para1);
System.out.println("para1 = " + para1.getTest());
System.out.println("result1 = " + result1.getTest());
TestClass para2 = new TestClass();
para2.setTest(new Integer(10));
TestClass result2 = test2(para2);
System.out.println("para2 = " + para2.getTest());
System.out.println("result2 = " + result2.getTest());
}
public TestClass test1(TestClass t) {
t = new TestClass();
t.setTest(new Integer(20));
return t;
}
public TestClass test2(TestClass t) {
t.setTest(new Integer(20));
return t;
}
class TestClass {
Integer test = null;
public void setTest(Integer i) {
test = i;
}
public Integer getTest() {
return test;
}
}
}
执行后的结果是:
para1 = 10
result1 = 20
para2 = 20
result2 = 20
为什么会这样呢?因为test1想通过修改参数的引用来修改返回值,但是在JAVA中,参数的引用是不可修改的,所以para1和result1分别指向不同的空间,结果也不一样。而在test2中,result2和para2始终指向同一块区域,test2方法修改的是参数内容,而不是参数的引用。
从上面看来,因为参数的引用不可改变,如果理解为“参数的值就是对该对象的引用”,那么java自然只有值传递。
二,认为是引用传递。还是上面的例子,如果在参数传递时理解为“参数的值就是该对象的内容”,那么显然不是值传递,因为对象的内容已经改变了。
认为是引用传递还有一个理由,就是java有一个保留字byvalue,现在的JDK版本中还没有实现这个保留字,似乎是在暗示对这种观点的支持。(There appears to be some support for this view within Sun, since one of the “reserved but not implemented” keywords is byvalue.)
所以说,对于原题的结论,是值传递还是引用传递并不重要,重要的是要理解“对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。”
分享到:
相关推荐
java参数传递时到底是值传递还是引用传递分享.pdf
java参数传递时到底是值传递还是引用传递[归类].pdf
Java:按值传递还是按引用传递详细解说
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...
58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...
这里详细的说明了,java参数传递的过程,引用传递,值传递
Java中传递对象时传递的并不是对象中的内容, 而是对象的地址。
java 值传递和引用传递的比较区别,包括代码及详解
不管是按值传递还是按引用传递,都是把栈中的数据备份了一份给参数变量,只不过值类型备份的是具体的数值,而引用类型备份的是内存地址
这个在Java里面是经常被提起的问题,也有一些争论,似乎最后还有一个所谓的结论:“在Java里面参数传递都是按值传递”。事实上,这很容易让人迷惑,下面先分别看看什么是按值传递,什么是按引用传递,只要能正确理解...
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。
Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递
Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递Java面向对象值传递和引用传递
12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值传递.zip12.参数传递之值...
java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo
java参数传递 java 参数
Java参数传递的经典教学PPT,引用类型,基础类型传递的区别,String和StringBuffer类型传递的区别。