class OuterClass { int outer; InnerClass innerObj; public OuterClass(int o) { outer = o; innerObj = new InnerClass(2*o); } public String toString() { return "outer (int): "+ outer + ", innerObj: "+innerObj; } class InnerClass { private int innerPriv; public InnerClass(int p) { innerPriv = p; } public final void setInnerPriv(int p) { innerPriv = p; } public String toString() { return "innerPriv: "+innerPriv; } } class InnerInnerClass extends InnerClass { public InnerInnerClass(int p) { super(2*p); } } class OuterInnerClass extends OuterClass { public OuterInnerClass(int o) { super(o); } } public static void main(String [] args) { OuterClass outer = new OuterClass(2); OuterClass.InnerClass inner = outer.new InnerClass(10); OuterClass.InnerInnerClass innerInner = outer.new InnerInnerClass(10); System.out.println(outer); System.out.println(inner); System.out.println(innerInner); } } class AnotherOuterClass extends OuterClass { public AnotherOuterClass(int p) { super(p); } class AnotherInnerClass extends OuterClass.InnerClass { public AnotherInnerClass(int p) { super(p); } } }