class Outer { class Inner1 extends Outer { Inner1() {} Inner1(Outer o) {} } class Inner2 extends Inner1 { public Inner2(Object o) { o.super(); } public Inner2(int o) { Outer.this.super(); } public Inner2(Outer o) { o.super(Outer.this); } public Inner2(Outer o, int par) { o.super(this); } public Inner2(Outer o, Object par) { this.super(o); } } class BadInner extends Inner1 { BadInner() {} } class BadInner2 extends Inner1 { } class s { void f(Object o) { new s(); Outer.this.new s(); } } } class Outer2 { class Inner {} } class Ext extends Outer2 { class ExtInner extends Inner { ExtInner() { super(); } } } class C { C(int i) { } int x() { return 1; } } class D extends C { D() { super(D.super.x()); } }