内部类继承

来源:互联网 发布:mac 10.10.5 升级包 编辑:程序博客网 时间:2024/05/16 18:24


定义一个内部类时,这个内部类会有一个隐式引用(implicit reference)指向外部类的实例。例如下面的代码:

[java] view plaincopyprint?
  1. class WithInner {  
  2.     class Inner {}  
  3. }  
其实,内部类Inner默认会有一个带参数的构造函数,我们通过反射来看一下。
[java] view plaincopyprint?
  1. import java.lang.reflect.Constructor;  
  2. import java.lang.reflect.Field;  
  3. class WithInner {  
  4.     class Inner {  
  5.         public void getConstructors() {  
  6.             for (Constructor<?> cons : getClass().getDeclaredConstructors()) {  
  7.                 StringBuilder sb = new StringBuilder();  
  8.                 sb.append("constructor: ").append(cons.getName()).append("(");  
  9.                 for (Class<?> param : cons.getParameterTypes()) {  
  10.                     sb.append(param.getSimpleName()).append(", ");  
  11.                 }  
  12.                 if (sb.charAt(sb.length() - 1) == ' ') {  
  13.                     sb.replace(sb.length() - 2, sb.length(), ")");  
  14.                 } else {  
  15.                     sb.append(')');  
  16.                 }  
  17.                 System.out.println(sb);  
  18.             }  
  19.         }  
  20.     }  
  21. }  
  22.   
  23.   
  24. public class InheritInner {  
  25.     public static void main(String[] args) {  
  26.         WithInner wi = new WithInner();  
  27.         WithInner.Inner i = wi.new Inner();  
  28.         i.getConstructors();  
  29.     }  
  30. }  
输出结果为:constructor: WithInner$Inner(WithInner)
从结果可以看出参数的类型就是就是外部类(outer class),也就是说,构造内部类的时候,必须要给它一个外部类的引用。接下来我们让InheritInner继承WithInner.Inner
[java] view plaincopyprint?
  1. class WithInner {  
  2.     class Inner {}  
  3. }  
  4. public class InheritInner extends WithInner.Inner {  
  5.     public static void main(String[] args) {  
  6.     }  
  7. }  
无法通过编译:
InheritInner.java:5: an enclosing instance that contains WithInner.Inner is requiredpublic class InheritInner extends WithInner.Inner {       ^1 error

报错信息提示我们InheritInner需要一个WithInner实例。

那我们给InheritInner加上我们反射出的带参数的构造函数。照样编译通不过,而且会报同样的错误。这是因为语法规定:在继承内部类的时候,在构造函数中必须要添加enclosingClassReference.super()

[java] view plaincopyprint?
  1. class WithInner {  
  2.     class Inner {}  
  3. }  
  4.   
  5.   
  6. public class InheritInner extends WithInner.Inner {  
  7.     public InheritInner(WithInner wi) {  
  8.         wi.super();  
  9.     }  
  10.     public static void main(String[] args) {  
  11.         WithInner wi = new WithInner();  
  12.         InheritInner ii = new InheritInner(wi);  
  13.     }  
  14. }  
0 0