Nick Nick Nick Nick - 3 months ago 9
Java Question

Inheriting from inner class

|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|\|
Code:

public class A {
public A() {
System.out.println("A()");
}

public class B {
public B() {
System.out.println("B()");
}
}
}
class Caller extends A.B {
Caller(A a){
a.super();
}
}


public class Main {
public static void main(String[] args) {
Caller as= new Caller(new A());
}
}


Why do we need
a.super()
call in class extending inner class? What does it doing?
Without
a.super()
program does not want to compile!

Error:(48, 20) java: an enclosing instance that contains A.B is required

Answer

The answer is: because that's how it is specified in the Java Language Specification.

Your class A.B is an inner class of A. The constructor has a hidden argument of type A - the enclosing (outer-class) instance.

You have subclassed A.B in your class Caller, which is itself not an inner class. But the constructor of the superclass needs this hidden instance of A - the outer class instance.

The way in which you pass this in Java is using this a.super(); syntax.

The Java Language specification defines this in section 8.8.7.1:

Qualified superclass constructor invocations begin with a Primary expression or an ExpressionName. 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.