我是一个java初学者,以前一直用C。在java开发中常和C对比来思考一些问题。我知道java中参数的传递都是用传值的方式,如果参数是对象,则传递的是对象地址的拷贝。我看到下面一段程序:
注:这是在一个函数中的一段代码,rs是一个ResultSet,Conmessage是一个定义好的class。
{......
Collection first=new ArrayList();
while(rs.next()){
Conmessage mess=new Conmessage();
mess.setName(rs.getString("Name"));
first.add(mess);}
......}
代码中,mess是一个对象,增加到first中,按理说只是传递了mess的地址吧。那么while中每一个循环结束这个mess对象就应该被释放掉,相应的first里面的地址也就失效,指向的是无效数据了,但是事实上不是这样,好像add(object)是按照参数对象本身的值传值进去的,也就是说mess的析构和ArrayList里面的值毫无关系了?这是为什么?
另外,我猜想java是不是这样处理的:回收mess时看到这个对象仍然被有效的地址引用着(add到first里面的那个新地址),就不回收它了?
请各位为我解释一下,谢谢。
注:这是在一个函数中的一段代码,rs是一个ResultSet,Conmessage是一个定义好的class。
{......
Collection first=new ArrayList();
while(rs.next()){
Conmessage mess=new Conmessage();
mess.setName(rs.getString("Name"));
first.add(mess);}
......}
代码中,mess是一个对象,增加到first中,按理说只是传递了mess的地址吧。那么while中每一个循环结束这个mess对象就应该被释放掉,相应的first里面的地址也就失效,指向的是无效数据了,但是事实上不是这样,好像add(object)是按照参数对象本身的值传值进去的,也就是说mess的析构和ArrayList里面的值毫无关系了?这是为什么?
另外,我猜想java是不是这样处理的:回收mess时看到这个对象仍然被有效的地址引用着(add到first里面的那个新地址),就不回收它了?
请各位为我解释一下,谢谢。
所以,在java中,你虽然不需要自己管理内存,但要避免长期引用不再使用的对象,尤其要避免循环引用(如a引用b,b又引用a),以便垃圾回收器能及时回收无用对象。
楼主有C语言背景,这对理解java的一些底层机制是很有帮助的,建议读一读《Thinking in JAVA》中的相关章节,里面对JAVA的内存管理有非常精辟的论述。