2014-11-04 47 views
0

我读过关于class fromal parameters的问题,然后问题出现,为什么下面的代码是不合格的?Java中的内部类构造

A

package org.gradle; 

public class A extends B.Inner{ 

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

B

package org.gradle; 

public class B{ 

    public class Inner{ 
    } 
} 

什么说的关键部分是:

非私有内部成员类的构造函数隐 声明,作为第一个形式参数,一个变量代表 立即封闭类

这样的情况下,我希望,除了默认的构造函数,我们应该有一个具有以下签名的构造函数:

Inner(B b); 

为什么不呢?

回答

1

“额外”参数对您来说是有效隐藏的 - 无论是在声明时还是在执行时。当你执行它,你提供以不同的方式的值 - 在你的情况下,通过s

s.super(); 

这是通过s作为隐藏的额外参数的构造函数B.Inner。所有这些的语法都有点奇怪 - 我个人会尽量避免在这种情况下使用内部类......他们只是很快就会变得怪异。我通常更喜欢静态嵌套类,如果我需要一个内部类,它几乎总是私有的。在不同的顶级类中声明的内部类的子类是一个奇怪的情况,IMO。

+0

谢谢,但它不是很清楚为什么我不能明确地调用该构造函数,如http://ideone.com/igXgCM? May JLS提供了我失去的限制吗? – 2014-11-04 07:21:43

+1

@ St.Antario:这不是内部类的工作方式 - 你会使用'new B()。new Inner()'来代替。你不打算把它看作是一个额外的参数 - 你打算把它看作是用来构造内部类实例的封闭类的实例。 – 2014-11-04 07:22:59

+0

JLS是否明确指出? – 2014-11-04 07:26:51

1

您已经经过外围实例sB类的),当你调用s.super()内部类的构造函数,所以没有必要通过的B另一个实例。

variable representing the immediately enclosing instance of the class是一个隐式参数,它使用特殊的语法传递给构造函数。