`
DoubleEO
  • 浏览: 154464 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

参数到底怎样传递?只有传值!!

阅读更多
只有传值!!
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

分享到:
评论
3 楼 qtalen 2010-01-02  
283933851 写道
应该说是 传递的是栈的副本 比较好一点

是的,基本类型在栈里面,会把值拷贝一份传过去。对象类型会把对象在栈里的引用拷贝一份传过去。对象本身在堆里面,不会复制
2 楼 283933851 2009-12-30  
应该说是 传递的是栈的副本 比较好一点
1 楼 nepenthe 2009-06-16  
靠,完全晕乎乎...

相关推荐

Global site tag (gtag.js) - Google Analytics