内部类构造函数调用

时间:2014-11-08 07:25:22

标签: java

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()。为什么会如此不同?

1 个答案:

答案 0 :(得分:3)

尝试在第二个示例中调用B.Inner(B)

找不到它,因为只有B.Inner(B, B)。如果您的构造函数为B.Inner(),则会将其更改为Inner(B) ...如果您的构造函数为B.Inner(B),则会将其更改为B.Inner(B, B)

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