I was going through various online sources on Java inner classes, and thought I’d summarize the notes here. This blog post does assume that the reader is familiar with what a local and anonymous inner class is, and will instead talk about some of the interesting properties.
Inner class contains a implicit reference of the Outer class instance it belongs to.
Consider:
public class A { public class B { private int var = 0; private A refParent() { return A.this; } } }
We see that the implicit reference to parent can actually be obtained through [InstanceNameOfParentClass].this
This property means that an instance of an inner class is attached to the instance of the outer class. A significant implication here is that the outer class cannot be garbage collected for as long as a strong reference to the inner class exists somewhere, because the inner class implicitly references the parent.
Creating an instance to a inner class
If the inner class is not private (or protected if you are out of package), then you can instance the inner class through a special new operator
A a = new A(); A.B b = a.new B();
Notice that a instance of the outer class must be created first before generating the instance of the inner class (due to the required implicit reference)
You cannot declare static members in a non-static inner class
This happens because an inner class is linked to a parent instance, thus it cannot contain any static members itself. However if the inner class is static, then it is allowed to have static members and it will not contain a reference to the outer class.
Only nested classes can be declared static (Why use it?)
Why do we use static inner classes? Simple, you can use the inner class without a reference to the outer class (since it doesnt contain any reference to it, and can be instanced through [ClassName].[NestedClassName]
Private methods and variables in the inner class are accessible to parent (vice versa)
http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members
http://stackoverflow.com/questions/663059/why-do-inner-classes-make-private-methods-accessible
Noting that since inner class is treated as a member of the outer class, they have access to each other’s private members