在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最后都指向了对后一个对象的地址。