A normal inner class is simply defined within the class of another class, as shown below.
package littletux.net.innerclass; public class InnerClass { private PrintManager pm; /*****************************************************************/ // Inner class - InnerClass$InnerPrinter.class class InnerPrinter implements Printer { @Override public void printString(String value) { System.err.println("InnerPrinter: " + value); } } /*****************************************************************/ public static void main(String[] args) { InnerClass app = new InnerClass(); app.initApp(); app.runApp(); } private void initApp() { pm = new PrintManager(); /*****************************************************************/ pm.setPrinter(new InnerPrinter()); /*****************************************************************/ } private void runApp() { pm.print("Hello World"); } }
It is also possible to make the inner class private, which is a useful pattern for hiding implementation details. If the inner class is not private (means, has default access or public access) it can be instantiated from other classes with a somewhat specific syntax:
The intuitive way would be to call something like
InnerClass.InnerPrinter ip = new InnerClass.InnerPrinter();
However, since inner classes (means, non-static nested classes) always require an instance, this does not work – we require an instance of the enclosing class and then need to call the new operator on this instance:
InnerClass ic = new InnerClass(); InnerClass.InnerPrinter ip = ic.new InnerPrinter();