关闭

java是否是只有按值传递?

891人阅读 评论(0) 收藏 举报

2006-02-14 | java是否是只有按值传递。

public void call(Test t) {
Test t2 = new Test();
t2.setName("cba');
t.setName("abc");
t = t2 ;
}

public static void main(String[] arg) {
Test obj = new Test();
call (obj) ;
System.out.println("obj"+obj.getName());
}

Java方法调用的一切中心都是栈(Stack).
每一个方法调用都产生一个独立的栈桢(Stack Frame)。在方法调用开始的时候,会把操作数压栈,return的时候,如果有返回值,则把返回值压入调用者程序的栈。方法结束后其栈桢被销毁。

所谓的传值就是这样实现的。

进入call()方法后,t和t2都只是本地变量,t的引用值由调用者压栈。对t执行setName()显然仍然执行对原对象的调用。而最后t=t2是通过一次压栈和一次弹出完成的。但是请记住,这个栈桢在这一句后被立即销毁,不会对调用者的栈桢产生影响。

*java传递是引用拷贝,既不是引用本身,更不是对象。

可以通过方法来改变被引用的对象中的属性值,却无法改变这个对象引用(Object reference)本身.也就是当一个对象的实例被创建的时候,like this: Apple a = new Apple(); a 存的就是这个对象实例的地址。而这个地址,也就是a的值作为参数传到某个函数中的时候,a本身是不会改变的。

总结:
1:对于值类型的参数来说,传递的是值的拷贝.
2:对于引用类型的参数来说,传递的是引用本身的拷贝.
所以关键要看你如何理解传值中的这个“值”了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1057142次
    • 积分:11114
    • 等级:
    • 排名:第1428名
    • 原创:166篇
    • 转载:224篇
    • 译文:0篇
    • 评论:129条
    最新评论