I investigate java inner classes.
I wrote example:
public class Outer {
public Outer(int a){}
public class Inner {
public Inner(String str, Boolean b){}
}
public static class Nested extends Inner{
public static void m(){
System.out.println("hello");
}
public Nested(String str, Boolean b , Number nm) { super("2",true); }
}
public class InnerTest extends Nested{
public InnerTest(){ super("str",true,12); }
}
}
I invoke it from main using following string:
new Outer(1).new Inner("",true);
I see compile error:
java: no enclosing instance of type testInheritancefromInner.Outer is in scope
Can you explain me this situation?
UPDATE
解决方案
Inner is an inner class. It can only be created when there is an enclosing instance of the class containing the Inner class definition.
However, you've created a static nested class, Nested, which extends from this class. When you try to invoke the super constructor
public Nested(String str, Boolean b , Number nm) { super("2",true); }
it will fail because the super constructor, for Inner, depends on an instance of Outer, which doesn't exist in the static context of the Nested class. Jon Skeet provides a solution.
An explanation of the solution appears in the JLS here.
Superclass constructor invocations may be subdivided:
Unqualified superclass constructor invocations begin with the keyword
super (possibly prefaced with explicit type arguments).
Qualified superclass constructor invocations begin with a Primary
expression.
They allow a subclass constructor to explicitly specify the newly
created object's immediately enclosing instance with respect to the
direct superclass (§8.1.3). This may be necessary when the superclass
is an inner class.