java 参数传递是引用传递还是值传递?
2013-11-13 08:16
399 查看
JAVA的参数传递倒底是值传递还是引用传递,我觉得两种说法都没错,关键是看怎么理解“引用”和“引用传递”。
(一)
从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JAVA中,你只能通过在形参上调用方法来修改实参所引用的那个对象,却修改不了实参本身(不能使它引用到另个对象),如:
void f(ArrayList list) {
list = new ArrayList(); //不影响外边的实参。
}
所以从这个角度,JAVA中根本就没有“引用传递”(不像C#中,真的有引用传递,只需要加个ref或out关键字,就不仅可以修改实参所引用的对象,还能修改实参本身)。
这种说法并非没有道理,因为如果说“通过一个具有索引功能的东西来修改它所索引的那个东西”就算引用传递的话,那么也可以任何语言的参数传递都可进行引用传递了。那你说Windows API中和各种HANDLE算不算“引用传递”呢?
(二)在JAVA中,除了内建类型的变量,“一切都是引用”,所以传递一个非内建类型的参数,当然也就是传递一个引用,所以,也可以说JAVA中所有的(除非内建类型)参数传递又“都是引用传递”。
只要明白(一)和(二)所说的根本不是一回事,就知道许多人在争些什么了。
(一)
从编译原理的角度讲,所有那些无法通过形参来修改实参本身的传递机制都是“值传递”,在JAVA中,你只能通过在形参上调用方法来修改实参所引用的那个对象,却修改不了实参本身(不能使它引用到另个对象),如:
void f(ArrayList list) {
list = new ArrayList(); //不影响外边的实参。
}
所以从这个角度,JAVA中根本就没有“引用传递”(不像C#中,真的有引用传递,只需要加个ref或out关键字,就不仅可以修改实参所引用的对象,还能修改实参本身)。
这种说法并非没有道理,因为如果说“通过一个具有索引功能的东西来修改它所索引的那个东西”就算引用传递的话,那么也可以任何语言的参数传递都可进行引用传递了。那你说Windows API中和各种HANDLE算不算“引用传递”呢?
(二)在JAVA中,除了内建类型的变量,“一切都是引用”,所以传递一个非内建类型的参数,当然也就是传递一个引用,所以,也可以说JAVA中所有的(除非内建类型)参数传递又“都是引用传递”。
只要明白(一)和(二)所说的根本不是一回事,就知道许多人在争些什么了。
相关文章推荐
- Java中函数参数的传递形式是值传递 还是引用传递
- [Java] Java参数传递,究竟值传递还是引用对象(转)
- 关于Java对象作为参数传递是传值还是传引用的问题
- Java函数传递参数:值传递还是引用传递
- Java参数传递传递的是值还是引用?
- Java 把对象作为参数传到一个方法里,这个是值传递还是引用传递, 为什么结果这么怪?
- Java参数传递:到底是传值还是传引用
- Java中函数参数的传递是值传递还是引用传递
- java参数传递时到底是值传递还是引用传递
- java的方法调用,参数是按值传递还是按引用传递
- Java 中参数传递是传值还是引用?
- 【Java】函数中的参数传递是“引用传递”还是“值传递”?
- 面试之路(18)-java的函数参数传递类型之值传递还是引用传递
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- 画重点,Java方法的参数到底是值传递还是引用传递?
- JAVA 参数传递 是值传递 还是引用传递的问题。
- Java中,String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?
- java参数传递。传递值还是引用问题
- Java的参数传递到底是引用传递还是值传递
- 通过2个实例分析java参数传递时按值传递还是按引用传递