浏览 2530 次
锁定老帖子 主题:参数到底怎样传递?只有传值!!
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-05
最后修改:2009-01-05
import java.awt.Point; public class PassByValue { public static void main(String[] args) { Point p = new Point(0,0); int i=10; System.out.println("修改之前是: p="+p+"i="+i); modifyPoint(p, i); System.out.println("修改完是: p="+p+"i="+i); } public static void modifyPoint(Point pt,int j) { pt.setLocation(5, 5); j=15; System.out.println("在modifyPoint方法中 pt="+pt+"j="+j); } } 结果: 修改之前是: p=java.awt.Point[x=0,y=0]i=10 在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15 修改完是: p=java.awt.Point[x=5,y=5]i=10 关于基本类型。传递的是值,这个值怎么理解,代码中的i只是一个值的提供者,他仅仅负责提供一个值,这个值是10,相对于modifyPoint()他就没什么用了,他自己不会搭进去,换种想法,无论什么提供者,就是能产生值而已,就这么点功能,夸张的说,你本人跑程序里,提供个值,你又跑出来,值让人家用着,和你没关系,所以这个提供者是什么都不要紧,关键的是这个值。 代码中反应就是main中的i未发生改变,还是10.许多人都说这是i的副本传进去了,不知道官方有没有这种说法,但是这样的说法我认为非常贴切,可以更好的理解传值。 关于对象类型。对象的传递分歧就多了,这个误解源于 引用 【所有的java objects 都是 object references】这一事实。引用自Peter·Haggar ,回到程序中,传递进modifyPoint()方法是值,是什么值?引用的值,而不是对象的值,用副本来说,就是引用的副本,而不是对象的副本,引用 【java以by value方式传递object references】 ,什么是引用的值,引用中存的是对象的内存地址!地址就是引用的值,地址干什么用?指向引用的对象!所以p和pt指向相同的对象,pt改变了对象的值,那么p所引用的对象也受影响.
和基本类型有一些区别,对象类型传值,p也只是值的提供者,和他本身无关,他自身是引用吗,但是与他引用的对象有关,他把值(地址)的副本传递进去了,这个玩意可以找到对象啊,所以相应的对象也改变了。 modifyPoint()一直在和同一个对象打交道。如果不想在modifyPoint中改变Point对象,2种方法可以。 (1)对modifyPoint()传递一个Point对象的克隆版本。 modifyPoint()方法传入的形参改变了 modifyPoint((Point)p.clone(), i); 修改之前是: p=java.awt.Point[x=0,y=0]i=10 在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15 修改完是: p=java.awt.Point[x=0,y=0]i=10 (2)令Point对象成为immutable(不可变的)。 final Point p = new Point(0,0); 修改之前是: p=java.awt.Point[x=0,y=0]i=10 在modifyPoint方法中 pt=java.awt.Point[x=5,y=5]j=15 修改完是: p=java.awt.Point[x=5,y=5]i=10 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-16
靠,完全晕乎乎...
|
|
返回顶楼 | |
发表时间:2009-12-30
应该说是 传递的是栈的副本 比较好一点
|
|
返回顶楼 | |
发表时间:2010-01-02
283933851 写道 应该说是 传递的是栈的副本 比较好一点 是的,基本类型在栈里面,会把值拷贝一份传过去。对象类型会把对象在栈里的引用拷贝一份传过去。对象本身在堆里面,不会复制 |
|
返回顶楼 | |