java方法调用时,是传值还是传引用?(转)

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=211634

网上文章都说是传值,有文章如下说  
当你向一个方法传递一个对象时,Java没有把对象放入堆栈,它只是拷贝对象的引用然后将这个引用的拷贝放入堆栈。也就是说,根据定义,Java使用的是传值方式。  
 
可是我做试验,怎么觉得是传的引用呢  
代码如下  
Foo.java  
public  class  Foo  {  
           public  int  bar;  
}  
 
Test.java  
public  class  Test  {  
       public  static  void  main(String  []args)  {  
               Foo  f  =  new  Foo();  
               f.bar  =  5;  
               System.out.println("f.bar="  +  f.bar);  
               func(f);  
               System.out.println("f.bar="  +  f.bar);  
       }  
 
       public  static  void  func(Foo  p)  {  
               p.bar  =  6;  
       }  
}  
 
输出结果是  
f.bar=5  
f.bar=6  
 
对象在方法中被改变,这不是传引用的结果吗  
---------------------------------------------------------------  
 
基本对象传递的是值,这是毫无疑问的  
非基本对象传递的是引用,但这个引用本身是通过值传递来实现的  
例如:  
public  static  void  tripleSalary(Employee  x)  
{  
x.raiseSalary(100);  
}  
调用  
test=new  Employee(...);  
tripleSalary(test);  
将改变对象中的数据的值,因为此时test和x都指向相同的对象  
但是例如:  
public  static  void  swap(Employee  x,Employee  y)  
{  
Employee  temp=x;  
x=y;  
y=temp;  
}  
调用  
Employee  a=new  Employee(...);  
Employee  b=new  Employee(...);  
swap(a,b);  
是不会改变x,y指向的对象的,尽管a和x、b和y指向的是相同的对象,但a,b仅仅是x,y的拷贝  
这与c++中的引用a=&x是不同的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值