They are internal (nested non-static) classes:
public class Outer { public class Inner { public void foo() { ... } } }
You can do:
Outer outer = new Outer(); outer.new Inner().foo();
or simply:
new Outer().new Inner().foo();
The reason for this is that Inner has a reference to a specific instance of the outer class. Let me give you a more detailed example of this:
public class Outer { private final String message; Outer(String message) { this.message = message; } public class Inner { private final String message; public Inner(String message) { this.message = message; } public void foo() { System.out.printf("%s %s%n", Outer.this.message, message); } } }
and run:
new Outer("Hello").new Inner("World").foo();
Outputs:
Hello World
Note. nested classes can be static too. If so, they do not have an implicit this reference for the outer class:
public class Outer { public static class Nested { public void foo() { System.out.println("Foo"); } } } new Outer.Nested.foo();
Most often, static nested classes are private , since they are usually implementation details and a neat way to encapsulate part of the problem without polluting the public namespace.
cletus May 19 '10 at 5:50 a.m. 2010-05-19 05:50
source share