首页 > 代码库 > 【Stackoverflow好问题】Java的参数,是按值传递还是按引用传递
【Stackoverflow好问题】Java的参数,是按值传递还是按引用传递
明确地说,java是按值传递的!java的世界里,都是按值传递。其实按值、按引用都只是个概念,关键是我们如何去理解java传参的本质。下面就结合一个例子来说
有些情况下,传递的值,其内容是个引用,这一点容易让人产生困惑。
请看下面的例子
首先有如下代码
Dog myDog = new Dog("Rover"); foo(myDog);
这时,你传给了foo函数一个值,这个值的内容,就是Rover这只dog的内存地址(这只是粗略的说明,因为在java中,这个地址并非是真正的地址)
假设这时候Rover这只狗的地址是42,那么我们就是传了42这个地址给foo方法
public void foo(Dog someDog) { someDog.setName("Max"); // AAA someDog = new Dog("Fifi"); // BBB someDog.setName("Rowlf"); // CCC}
在foo方法中,是这样一个过程
1、参数 someDog的值是一个地址(42)
2、在AAA这一行:
因为someDog代表了42那只狗,42这只狗的名字,从Rover被改成了Max
3、在BBB这一行:
这就是关键的地方了,又new了一只dog,new 意味着又在新的地址空间放上了一只Dog,我们假设其地址是74。这时,someDog的值,会从42变成了74
4、在CCC这一行:
这时候的修改,是对74那只狗的修改,而非42
因此,对于foo的参数someDog来说,它是一个值,而非引用。它是一个值,因此他的值任意改变,例如从例子中的地址42改成74。它不是一个引用。如果它是引用,那么在foo方法内部的修改(包括BBB、CCC这两行),都应该会对42地址空间的dog产生影响
不细究概念了,再总结下Java初学者容易犯错的地方:
假如你想像例子一样
“
Object a = new Object();
foo(a);//在方法内部修改a的属性值
return a;//希望此时的a已经是修改后的值
”
要切记,这个Objct一定要在调用方法前,就初始化好(new一个),然后再作为参数传进去,之后在方法中再修改bean的某些属性,才会影响到之前初始化的这个Object;如果在方法内再执行new操作,实际已经指向了其他的地址空间
知识补充:
1、什么是值传递?
指的是在方法调用时,传递的参数是按值的拷贝传递。按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了,每个值都对应到一个地址空间
2、什么是引用传递
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
stackoverflow链接
http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value
专栏介绍:
非常喜欢stackoverflow,总能在上面找到疑难杂症的解决办法。偶然发现该网站有一个热度榜单。于是精选了热度较高的一些问题,阅读每个问题的答案,然后按照自己的理解梳理出来。因此,这些文章不是真正的翻译,而是按照自己的理解做了一些增删、润色,希望能把上面的讨论,更精简有效地分享给大家。
如需转载,请注明原文地址
http://blog.csdn.net/lizeyang
【Stackoverflow好问题】Java的参数,是按值传递还是按引用传递
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。