内部类构造函数调用



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{
    }
}

正如这里所说的b.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()。为什么这么不同?

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

它找不到它,因为只有一个B.Inner(B, B)。如果您的构造函数是B.Inner(),那么它将更改为Inner(B)。。。如果你的构造函数是B.Inner(B),那么它就会变为B.Inner(B, B)

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

最新更新