转自:http://www.jiehoo.com/java-pass-parameter.htm
Java参数传递方式
其实这个问题我原来翻译(破除java神话之二:参数是传址的 )、转帖别人的详细解释(Java 应用程序中的按值传递语义 )和专门解释( 我对《Java 应用程序中的按值传递语义》的理解)过,不过现在看来,原来翻译或者解释的角度是有问题的,从底层的角度解释并不直观,在交流的时候也容易引起误解,最终不能达成一致意见。下面以最终的效果来解释参数的传递方式:
1、对于原始数据类型,也就是int、 long、char之类的类型,是传值的,如果你在方法中修改了值,方法调用结束后,那个变量的值没用改变。
2、对于对象类型,也就是Object的子类,如果你在方法中修改了它的成员的值,那个修改是生效的,方法调用结束后,它的成员是新的值,但是如果你把它指向一个其它的对象,方法调用结束后,原来对它的引用并没用指向新的对象。
代码如下:
public class Tester {
public static void main(String[] args) {
int primitive = 2;
changePrimitive(primitive);
//primitive的值依然是2
MyClass myClass = new MyClass();
changeObject(myClass);
//myClass仍然指向的是执行changeObject之前的那个对象
//但是myClass.i等于3了
}
public static void changePrimitive(int primitive) {
primitive = 3;
}
public static void changeObject(MyClass myClass) {
myClass.i = 3;
myClass = new MyClass();
}
}
class MyClass {
int i;
}
对于远程调用,无论是什么类型,调用结束后,传入的参数和以前没用任何变化(当然前途是直接调用远程方法,如果中间经过其它的Proxy类或者Facade类,不能保证那些类对对象没用修改)。至于是通过Locale接口进行调用的,我不太清楚是否属于远程调用。以后确定了再来更新。
作者: Cherami
原载: Java参数传递方式
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
相关日志
* 修复不能评论的问题
* 使用参数方式还是页面配置方式
* 我使用的WordPress插件
* 解析XML的时候完全忽略DTD
随机日志
* 机场也可以种树
* Response被关闭
* Java面试中的经典对比问题
* 在目录中查找类位于哪个jar包中
添加到网摘
[del.icio.us] [新浪 VIVI] [365key] [YouNote] [博采中心] [Poco] [SOHU狐摘] [天极网摘] [和讯网摘]
喜欢这个插件?
当前日志信息
标题:
Java参数传递方式
发表:
2006-11-15
分类:
Java
标签:
java, 参数传递, 传值, 传引用
点击:
28
评价:
Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 Votes | Average: 0 out of 5 (暂无评价)
Loading ... Loading ...
该日志共有 3 条评论
发表评论 | RSS订阅 | 反向链接
1. oneal 2006-11-15
local 调用相当于同一个虚拟机上的对普通对象方法的调用。
上面那段代码眼熟啊,上个月做过,哈哈。
2. Cherami 2006-11-16
local调用可能是本地调用,但是感觉有可能会换成远程调用,这样如果没有意识到,可能会有潜在的bug。因为本地调用和远程调用的特性是不一样的。可能会误用特性。
3. English Study and Sharing » 博客文章 » Java参数传递方式 2006-11-19
[…] 对于远程调用,无论是什么类型,调用结束后,传入的参数和以前没用任何变化(当然前途是直接调用远程方法,如果中间经过其它的Proxy类或者 Facade类,不能保证那些类对对象没用修改)。至于是通过Locale接口进行调用的,我不太清楚是否属于远程调用。以后确定了再来更新。 作者: Cherami 原载: Java参数传递方式 […]
public static void changeObject(MyClass myClass) {
myClass.i = 3;
myClass = new MyClass();
}
搞不懂:为什么在方法内部把新生成的一个Myclass赋给引用myClass后,最后传入的myClass引用的值不是这个新生成的对象?
这个问题先放在这里,自己查找一下相关资料,实在解决不了再向朋友请教。
我想我已经可以回答上面的疑问了。
方法changeObject(MyClass myClass)中的引用myClass和方法外的那个myClass引用根本就不是同一个引用。所以,当方法内的myClass引用改变了引用的对象时,方法外的那个myClass引用指向的对象根本没有受到影响。
详情见今天我写的一篇日记:用"Java堆栈区数据复制"理解Java赋值和参数传递机制的心得