简体   繁体   中英

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?

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM