定义一个内部类时,这个内部类会有一个隐式引用(implicit reference)指向外部类的实例。
比如以下的代码:
class WithInner { class Inner {} }事实上。内部类
Inner
默认会有一个带參数的构造函数,我们通过反射来看一下。
import java.lang.reflect.Constructor; import java.lang.reflect.Field; class WithInner { class Inner { public void getConstructors() { for (Constructor<?> cons : getClass().getDeclaredConstructors()) { StringBuilder sb = new StringBuilder(); sb.append("constructor: ").append(cons.getName()).append("("); for (Class<?输出结果为:> param : cons.getParameterTypes()) { sb.append(param.getSimpleName()).append(", "); } if (sb.charAt(sb.length() - 1) == ' ') { sb.replace(sb.length() - 2, sb.length(), ")"); } else { sb.append(')'); } System.out.println(sb); } } } } public class InheritInner { public static void main(String[] args) { WithInner wi = new WithInner(); WithInner.Inner i = wi.new Inner(); i.getConstructors(); } }
constructor: WithInner$Inner(WithInner)
从结果能够看出參数的类型就是就是外部类(outer class),也就是说,构造内部类的时候。必需要给它一个外部类的引用。接下来我们让
InheritInner
继承WithInner.Inner
。
class WithInner { class Inner {} } public class InheritInner extends WithInner.Inner { public static void main(String[] args) { } }无法通过编译:
InheritInner.java:5: an enclosing instance that contains WithInner.Inner is required public class InheritInner extends WithInner.Inner { ^ 1 error
报错信息提示我们InheritInner
须要一个WithInner
实例。
那我们给InheritInner
加上我们反射出的带參数的构造函数。照样编译通只是,并且会报相同的错误。这是由于语法规定:在继承内部类的时候,在构造函数中必需要加入enclosingClassReference.super()
。
class WithInner { class Inner {} } public class InheritInner extends WithInner.Inner { public InheritInner(WithInner wi) { wi.super(); } public static void main(String[] args) { WithInner wi = new WithInner(); InheritInner ii = new InheritInner(wi); } }
OK,编译通过,执行也正常。可是为什么要这么做。我如今也不是非常清楚。
參考资料
- Thinking In Java
Written with StackEdit.