Inner class construction in Java

I've read about class fromal parameters and the question then arises as to why the following code is ill-formed?

class A:

package org.gradle;

public class A extends B.Inner{

    public A(B s){
        s.super(new B()); //error
        s.super();        //OK
    }
}

class B:

package org.gradle;

public class B{

    public class Inner{
    }
}

The key part of what was said is:

The constructor of a non-private inner member class implicitly declares, as the first formal parameter, a variable representing the immediately enclosing instance of the class

So, I expect that besides the default constructor, we should have a constructor with the following signature:

Inner(B b);

Why not?

Jon Skeet
people
quotationmark

The "extra" parameter is effectively hidden from you - both when you declare it, and when you execute it. When you execute it, you provide a value in a different way - in your case, via s:

s.super();

That's passing s as the hidden extra argument to the B.Inner constructor. The syntax for all of this is a little weird - and I would personally try to avoid using inner classes in this sort of situation... they just get weird very quickly. I usually prefer static nested classes, and if I do need an inner class, it's almost always private. Subclassing an inner class declared in a different top-level class is an odd situation, IMO.

people

See more on this question at Stackoverflow