2014-11-08 242 views
0

JLS说:内部类的构造函数调用

非私有内部成员类的构造函数隐含 声明,作为第一个正式的参数,较 立即封闭的实例变量班上。


好吧,如果我们写:

A类:

package org.gradle; 

public class A extends B.Inner{ 

    public A(B b){ 
     b.super();  //OK, invoke B.inner(B)   
    } 
} 

B类:

package org.gradle; 

public class B{ 

    public class Inner{ 
    } 
} 

至于说hereb.super()实际调用B.Inner(B)


但是,如果我们写

B类:

package org.gradle; 

public class B { 
    class Inner{ 
     public Inner(B b){ 
      System.out.println("Inner(B)"); 
     } 
    } 
} 

A类:

package org.gradle; 

public class A extends B.Inner{ 

    public A(B b) { 
     b.super(); //The constructor B.Inner() is undefined 
    } 
} 

因此,在后一个例子b.super()试图调用B.Inner()代替。为什么这么差?

+0

你需要调用'b.super(b)'。错误信息中没有显示“不可见”的第一个参数,因为它是“不可见的”。 – immibis 2014-11-08 07:28:00

+0

@immibis我不完全明白你的意思。我知道如何解决第二个例子。我想实现它。 – 2014-11-08 07:29:56

+0

如果你在第一个例子中写了'b.super(5);',你会说“B.Inner(B,int)未定义”或者“B.Inner(int)未定义”吗? – immibis 2014-11-08 07:30:52

回答

3

它确实尝试在第二个示例中调用B.Inner(B)。因为只有B.Inner(B, B),所以找不到它。如果您的构造函数是B.Inner(),那么它将变为Inner(B) ...并且如果您的构造函数是B.Inner(B),那么它将变为B.Inner(B, B)

请注意,隐藏参数实际上是一个实现细节,除非您正在研究Java编译器的工作方式,否则不需要知道它的存在。