java 为什么这题这样选?

来源:百度知道 编辑:UC知道 时间:2024/09/26 20:13:54
25. 1) class Hello {
2) public static void main(String[] args) {
3) Hello h=new Hello();
4) h.methodA();
5) }
6)
7) Object methodA() {
8) Object obj1=new Object();
9) Object obj2=new Object();
10) obj2=obj1;
11) obj1=null;
12) return obj2;
13) }
14) }
这一程序段中最有可能激活垃圾收集程序的地方是( 2 )
(1) 第9行之后
(2) 第10行之后
(3) 第11行之后
(4) methodA方法不会激活垃圾收集程序

java的垃圾收集不是那么可靠,为什么呢,因为激活垃圾回收线程的时机是在系统检测到资源实在是不够的时候(多是内存资源)

如果我们假定,执行到Hello h=new Hello(); 这里的时候系统出现资源紧张

第9行,是创建对象,肯定不会激活垃圾回收,
第10行,obj2指向了obj1的对象,这个时候原来obj2所指向的对象没有了对应的引用,换过来讲就是,没有一个引用指向原来obj2指向的对象,这个时候满足了垃圾回收的条件

第11行,obj1指向null,也就是说obj1这个引用不在指向其原来指向的对象,但是,引用obj2仍然指向改对象,所以条件不满足

对于答案的第四个说法,还是有可能的,但是我想该出题者应该是考核对象和引用的关系和垃圾回收的机制,所有选2是出题者的答案,但是实际情况谁知道呢?

因为当你执行第8,9两行程序后,就等于创建了两个对象.执行第10行,即obj2=obj1后,简单赋值操作,相当于把obj1存的地址传给了obj2,即obj2和obj1同时指向了某一个值,此时对象obj1已经没有任何引用指向它,你在程序中是无法使用它的,它将会被JVM回收(这是Java的垃圾回收机制)。 因此,选择2了

JAVA的数据类型分为两中 一种是值类型一种是引用类型.
引用类型的实例 也叫对象,存储在可管理堆中.引用类型变量的值存储在栈中,就是跟地址一样的东西.引用类型变量赋值语句是传递对象的地址.
obj2=obj1;这个语句里是把OBJ1的地址传给了OBJ2,那么OBJ2刚开始指定的对象没有了引用,当对象的引用变量被撤消时,表示对象的生命周期结束,这时候垃圾收集程序就把这个对象处理啦..
我实在是语言组织不太好,呵呵,能看懂吗?