Four objects are eligible for garbage collection when i3 = null;
is executed in the class shown below. I've added comments to explain how I got this answer. Is my reasoning correct?
public class Icelandic extends Horse{
public void makeNoise(){
System.out.println("vinny");
}
public static void main(String args[]){
/**
* 2 objects created
*/
Icelandic i1 = new Icelandic();
/**
* 2 objects created
*/
Icelandic i2 = new Icelandic();
/**
* 2 objects created
*/
Icelandic i3 = new Icelandic();
/**
* i3 is now pointing at i1, original Icelandic() referred to by i3 now
* has no reference - 2 objects now have no reference
*/
i3 = i1;
/**
* i3 is now pointing at i1, original Icelandic() referred to by i1 now
* has no reference - 2 objects now have no reference
*/
i1 = i2;
/**
* Total of six objects created, 4 objects no longer have a reference so 4
* can be garbage collected.
*
* Setting to null below doesn't make any difference to garbage collector
* as objects now do not have a reference
*/
i2 = null;
i3 = null;
}
}
interface Animal {
void makeNoise();
}
class Horse implements Animal{
Long weight = 1200L;
public void makeNoise() {
System.out.println("whinny");
}
}
These are steps of your program:
Icelandic i1 = new Icelandic();
Icelandic i2 = new Icelandic();
Icelandic i3 = new Icelandic();
i3 = i1;
i1 = i2;
i2 = null;
i3 = null;
So the last diagram concludes that only 2 objects are ready for garbage collection. I hope I am clear. You can see object names as references to the objects.
EDIT:
As said by BalusC, Long weight = 1200L is also object. So 2 more objects each for i1 and i3 are eligible or garbage collections. So in all 4 objects are eligible or garbage collection.