3.interface Animal { void makeNoise(); }
4.class Horse implements Animal {
5.Long weight = 1200L;
6.public void makeNoise() { System.out.println("whinny"); }
7.}
8. public class Icelandic extends Horse {
9. public void makeNoise() { System.out.println("vinny"); }
10. public static void main(String[] args) {
11. Icelandic i1 = new Icelandic();
12. Icelandic i2 = new Icelandic();
13. Icelandic i3 = new Icelandic();
14. i3 = i1; i1 = i2; i2 = null; i3 = i1;
15. }
16. }
问题 是 当运行到15行的时候 ,有多少个对象被回收?
在new第一个子类实例的同时,一个父类的实例同样被new出来了,因为你调用了父类的构造方法。而第二个子类去new就不会在new新的父类实例了。所以总共new出来了四个实例,子类为null,父类没有再去引用,一样要被回收,就有四个被回收了。
不知对不对,,可惜不能给自己分 那个高手能否给我确定下 我思考的对不对?
第14行的执行结果:
i3 = i1; -----i3指向i1。i3处于可回收状态。
i1 = i2; -----i1指向i2。但i3指向i1,所以i1不可回收。
i2 = null; ---i2处于可回收状态。同时由于i1也指向i2,i1也处于可回收状态。
i3 = i1; -----i3指向i1。i1处于可回收状态,故i3也可回收。第15行执行结果:
java垃圾回收器回收i1,i2,i3。望指正。i3 = i1; i1 = i2; i2 = null; i3 = i1;
一个父类的实例同样被new出来了!这个还真不知道
期待解答
Icelandic i1 = new Icelandic(); //1
Long weight = 1200L;//2
Icelandic i2 = new Icelandic(); //3
Long weight = 1200L;//4
Icelandic i3 = new Icelandic();//5
Long weight = 1200L;//6i3 = i1;//i3指向i1指向的对象,i3原对象等待被gc 同时Long weight = 1200L;//6 等待被 gc
i1 = i2;//i1指向i2指向的对象,i1原对象被i3引用所指向所以不会被gc
//到这里i3指向原来在i1的对象 i1指向原来在i2对象
i2 = null;//i2所指向对象被i1所指向,所以不会被gc
i3 = i1;//gc i3所指向在对象被gc,即原i1所指向的对象被gc
//所以最后剩下 原i2所指向的对象没被gc
被gc的是 原i1 和i3所指向的对象,2个 ,还有这二个对象中的Long weight = 1200L; 这个对象,又是2个
所以是4个ps:前面把题目看错了
运行到15行,程序结束了,所有对象都被回收
子类对象被创建,独立的父类对象没有创建(否则所有类都源于Object,一个程序要创建多少object对象),该“父类对象”存在于子类对象中,和子类对象共同存亡,但不能算一个独立的对象
楼主这是java的GC回收机制,请多看看书
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic(); i3 = i1;
/*i3释放当前持有对象的句柄,改换成第一个对象,那么第三个对象的句柄被所有变量放弃,第三个对象等待回收,这时i1和i3持有相同对象的句柄,即第一个对象。*/i1 = i2;
/*i1释放第一个对象的句柄,改换成第二个对象,但是第一个对象的句柄仍被i3持有(上一步执行的),不会被回收。所以此时i1和i2持有相同对象的句柄,即第二个对象,i3持有第一个对象的句柄。*/i2 = null;
//i2释放自身所持有的句柄,但是i2原有对象的句柄被i1持有,不会回收。i3 = i1; /*i3释放自身持有对象的句柄(第一个对象),改为和i1一样(第二个),i3原持有第一个对象的句柄已经被释放,所以第一个对象也将等待方法结束回收。此时i3和i1持有的是相同的第二个对象的句柄。*///所以,这里有两个对象的会被回收,就是第一个对象和第三个对象。
上述程序,在执行至15行时,只保留了一个对象的引用,其余两个生成的对象,都未能存在引用。
在15行过后,main方法完毕,所有引用都会被销毁,对应的对象也就都没有被引用了。
对于未被引用的对象,回收线程会根据回收算法进行回收。
所以,只能说,当程序执行至15行时,有多少对象可以被回收。
而不是,一定,被回收。
这样的情况下,应该是有2个对象,被放入回收队列,等待被回收。
有些情况下,并不是调用System.gc方法,未引用的对象就一定会被回收的。
除非 System.gc();
如果内存不够的时时候 是一定会启动回收机制的。