怎样继承一个内部类
来源:互联网 发布:大闹天宫魅羽进阶数据 编辑:程序博客网 时间:2024/04/29 20:07
定义一个内部类时,这个内部类会有一个隐式引用(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 requiredpublic 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.
1 1
- 怎样继承一个内部类
- 继承内部类
- java继承内部类
- java继承内部类
- Java 内部类继承
- 继承内部类
- 内部类继承
- Java 继承内部类
- java 继承 内部类
- Java高级特性之继承一个内部类
- 关于java内部类的继承的一个小问题
- 怎么继承一个非静态的内部类?
- 内部类的继承-内部类
- 内部类(多继承)
- 内部类实现多重继承
- 内部类实现多重继承
- 内部类实现多继承~
- java内部类的继承
- Linux中断机制
- 置换群
- Codeforces Round #267 (Div. 2) B. Fedor and New Game(位运算)
- leetcode - Reverse Integer
- Hadoop 之 数据去重(星星笔记)
- 怎样继承一个内部类
- System.gc()和-XX:+DisableExplicitGC启动参数,以及DirectByteBuffer的内存释放
- 2-07. 素因子分解(20) (ZJUPAT 数学)
- 一种基于边缘的运动目标检测与跟踪算法
- hdu 4056 Draw a Mess(数据结构-并查集)
- Swap Nodes in Pairs
- leetcode - Single Number
- 有关eclipse
- 封装一个类搞定90%安卓客户端与服务器端交互