Outer outer = new Outer();
an Object of Outer class is created on heap and reference variable points to it.
If I understand it right when I write
Outer.Inner inner=outer.new Inner();
an object of Inner class is created on heap and inner points to it. In heap we have two separate objects which contains their own instance variables.
But if I write
Outer.Inner inner=new Outer().new Inner();
still two Object would be created on heap one for Outer and other for Inner. But with reference the inner only Inner Object's members are accessible . Who is referring to the outer Object on heap? If it is not referred by any reference then it should be eligible for garbage collection which would then impact the usage of inner.
An inner class contains a hidden reference to its outer class instance. That hidden reference keeps the outer class instance alive if there are no other references to it.
To see this in action, take this source code and compile it:
Now use the java class inspection tool
javapto see the hidden reference:You'll see that there is a package-scope hidden reference called
this$0of typeOuter- this is the reference that I talked about above.