In the previous example, if you want to instantiate the inner class within a static method (e.g. the main method), this does not work (for the same reason described in the previous section when trying to instantiate the inner class from within another class):
...
public static void main(String[] args) {
InnerPrinter ip = new InnerPrinter();
...
}
...
No enclosing instance of type InnerClass is accessible. Must qualify the allocation with an enclosing instance of type InnerClass (e.g. x.new A() where x is an instance of InnerClass)
Since we do not have an enclosing instance available, we can use a static inner class like in the following example:
package littletux.net.innerclass;
public class StaticInnerClass {
/*****************************************************************/
// Inner class - StaticInnerClass$StaticInnerPrinter.class
static class StaticInnerPrinter implements Printer {
@Override
public void printString(String value) {
System.err.println("StaticInnerPrinter: " + value);
}
}
/*****************************************************************/
public static void main(String[] args) {
PrintManager pm = new PrintManager();
/*****************************************************************/
pm.setPrinter(new StaticInnerPrinter());
pm.print("Hello World");
/*****************************************************************/
}
}
Note that in this case, the inner class is bound to the class of the enclosing type – since no instance of the enclosing type needs to exist, the inner class does not have access to members of the enclosing class.