Inner class construction in Java

狂风中的少年 提交于 2019-12-11 20:02:47

问题


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?


回答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.




回答2:


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.



来源:https://stackoverflow.com/questions/26729566/inner-class-construction-in-java

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!