0

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?

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

4 Comments

Thanks, but it's not quite clear why can't I explictly invoke that constructor, say, as follows ideone.com/igXgCM ? May JLS provide a restrictions I lost?
@St.Antario: That's just not how inner classes work - you'd use new B().new Inner() instead. You're not meant to think of it as like an extra parameter - you're meant to think of it as the instance of the enclosing class used to construct the instance of the inner class.
Does JLS specify that explcitly?
@St.Antario: I suspect so, but I can't look for a little while. I suggest you look at both the "inner classes" section and the "constructor invocation" section.
1

You are already passing the enclosing instance s (of class B) to the constructor of the inner class when you call s.super(), so there's no need to pass another instance of B.

The variable representing the immediately enclosing instance of the class is an implicit parameter, and it is passed to the constructor using a special syntax.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.