01. interface Animal { void makeNoise(); }
02. class Horse implements Animal {
03. Long weight = 1200L;
04. public void makeNoise() { System.out.println("whinny"); }
05. }
06.
07. public class Icelandic extends Horse {
08. public void makeNoise() { System.out.println("vinny"); }
09. public static void main(String[] args) {
10. Icelandic i1 = new Icelandic();
11. Icelandic i2 = new Icelandic();
12. Icelandic i3 = new Icelandic();
13. i3 = i1; i1 = i2; i2 = null; i3 = i1;
14. }
15. }
直到第十四行,有多少对象可以被垃圾回收器回收java垃圾回收
02. class Horse implements Animal {
03. Long weight = 1200L;
04. public void makeNoise() { System.out.println("whinny"); }
05. }
06.
07. public class Icelandic extends Horse {
08. public void makeNoise() { System.out.println("vinny"); }
09. public static void main(String[] args) {
10. Icelandic i1 = new Icelandic();
11. Icelandic i2 = new Icelandic();
12. Icelandic i3 = new Icelandic();
13. i3 = i1; i1 = i2; i2 = null; i3 = i1;
14. }
15. }
直到第十四行,有多少对象可以被垃圾回收器回收java垃圾回收
一共创建了3个对象
第13行
当执行完i3=i1;时,i3原先引用的对象已经变成“不可达”的了,会被gc回收
执行完i1=i2;i2=null;时,i3引用一个对象,i1引用一个对象。没有对象被回收
执行完i3=i1;时,i3上一次引用的对象变成“不可达”的,被gc回收
现在只有一个对象未被回收,被i3和i1引用
到第十四行,还没有出main函数,所以对象不会被自动回收所以又2个对象被回收
所以你判断一下有多少不存在对某个对象的任何引用,就知道结果了。。
另外要注意的是垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,这点很重要。
第十四行 是什么位置? main 即将结束,以后不会再有任何对物理地址的引用,所以,我说你直接问有多个对象就完了。 全部 都可以被回收