java 参数赋值_【转】 Java中的变量赋值和参数传递

变量赋值和参数传递是java中两个容易让人迷惑的问题。

对于原始类型(primitives type),java采用值传递,这很明显。然而,当传递的参数类型是对象时,或者两个对象的变量进行赋值时,问题就有些复杂,很多初学者对此感到迷惑。

实际上,当赋值或者传递参数的时候,Java采取的都是一种值传递。

在下面的代码中,

class A{

int i=2;

}

class B{

static void change(A a){

a.i=31;

}

public static void main(String[] arguments){

A a1=new A();

A a2=new A();

change(a1);

System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=31,a2=2;

a1=a2;

System.out.println("a1: "+a1.i+"/na2: "+a2.i); // a1=2,a2=2;

}

}

当执行change(a1)时,JVM将a1复制一份传递给A的静态函数change(A

a)中的参数a,注意这里a1和a都是对象的引用,而不是对象本身。所以,传递的是对象引用的复制品。从而a1和a变成同一个对象的两个不同引用。因此,通过a1对对象的改变,和通过a对对象的改变,具有同样的效果。打个比方,有一道带有复杂无比的锁的门(对象),这扇门有一把钥匙(a1)。现在,另外一个人会开此门(方法change()的定义),他有一把想象中的钥匙(形参),但他没有事实上的钥匙。当此人需要开此门时,怎么办?他需要一把钥匙,而主人传给他的确实是一把钥匙,只不过这把钥匙是主人原先的钥匙的复制品!而这个复制品显然也能打开这扇复杂的门。

同样,对于第13行的

a1=a2;

是这样进行的:复制前,a1和a2分别是两个不同对象的引用,当赋值时,a2的值赋给a1,结果a1的值和a2的值相等,a1变成a2所引用的对象的另一个引用,即a1和a2变成同一个对象的引用,而这个对象是原先a2引用的对象。原先a1引用的对象则因为失去了所有的引用而被垃圾收集器处理掉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值