zoukankan      html  css  js  c++  java
  • 如何继承一个内部类

    定义一个内部类时,这个内部类会有一个隐式引用(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.

  • 相关阅读:
    【SpringMVC 从 0 开始】SpringMVC RESTFul 实战案例
    【SpringMVC 从 0 开始】SpringMVC RESTFul 实战案例
    【SpringMVC 从 0 开始】RESTFul 介绍
    【SpringMVC 从 0 开始】SpringMVC 的视图
    【SpringMVC 从 0 开始】域对象共享数据
    【SpringMVC 从 0 开始】SpringMVC 中获取请求参数
    angular-cdk 探索
    angular 自定义表单/*ngFor增删不更新
    小白都能跑通的3D地图demo
    腾讯地图:输入关键字选取地点
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7141461.html
Copyright © 2011-2022 走看看