java中参数的传递解惑

在java编程过程中,经常会遇到如下的问题:

   1. Java的参数传递为什么只有值传递;

    当参数为int这种数据类型的时候传递的的确是其数值,但是当参数传递的是一个对象的时候,其实传递的是对该对象的地址的应用,其实也是一个值,只不过该值代表了对象的引用而已。

    2.Java中关于生命周期的疑惑:

list<obj>list=new arrayList<obj>();
for(){
obj o=new obj();
o=i;
list.add(o);
}

为什么当o定义在循环外面的时候list里面添加的o都变成了一个值,即最后被赋的值,而当o被定义在里面的时候,则list可以得到不同的o呢?

看到网上同行的解答之后,豁然开朗,其实这涉及到了变量 、对象、变量和对象的生命周期等内容。

首先:

obj o=new obj()可以分解为3个步骤,

a.new obj()是生成了一个对象;

b.obj o是定义了一个变量;

c.o变量指向对象的引用。

其实当中并没有涉及到变量的重名问题,因为o为局部变量,当一个for循环结束后,o的生命结束,对象的生命周期要看jvm的回收机制,当回收掉了也就结束了。

当list添加的时候是添加的对象的引用,即o所指向的对象的地址。当第二个循环中再添加一个o时,这个时候o所指向的地址已经发生了变化,因此list里面的元素值是不同的。这个时候变量o其实跟第一个循环中的o没有半毛关系。第一个循环中的o已经死掉了。

当变量o是定义在循环外部的时候,情况截然不同了,变量o对于循环来说属于全局变量,其生命周期在循环全部结束后也不会结束,因此每个循环里面的o都是同一个o,list添加的也是同一个o指向的对象地址,list添加第一个o时,指向x,第二个o时指向y,则两个o都是y,以此类推,因为添加的o是相同的,所以o最后都指向了对后一个对象的地址。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值