This week's book giveaway is in the Mac OS forum. We're giving away four copies of a choice of "Take Control of Upgrading to Yosemite" or "Take Control of Automating Your Mac" and have Joe Kissell on-line! See this thread for details.
Each instance of I has a variable "other" that holds a reference to another instance of I.
Assigns the object reference i3 to i1's instance variable other. There by giving i1 a reference to the object currently referenced by i3.
Lets call the 4 objects created in these 2 lines O1, O2, O3, O4.
So at the end (before returning) of m1()
i1 is a reference to O1 i2 is a reference to O2 i3 is a reference to O3 i4 is a reference to O4
O1.other is a reference to O3 O3.other is a reference to O2 O2.other is a reference to O1
04.other is a reference to O4.
But after returning from m1() no live thread has a reference to O1, O2, O3, or O4 so I would think they are all eligible for garbage collection. You don't keep a reference to the J object created, so its eligible also. If the program didn't terminate after the call to m1() the array object reference by args wouldn't be eligible for garbage collection.