Thinking in java 之:内部类的继承
2015-09-07 13:14
281 查看
因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,事情会变得有点复杂。问题在于,那个指向外围类对象的“秘密的”引用必须被初始化。
要理解这个问题就得先理解内部类,Inner是InnerOut的内部类,那么一般的用法 InnerOut.Inner inner = new InnerOut(). new Inner() ;
我们可以看出要想创建Inner的对象必须先创建InnerOut的对象之后才能创建Inner对象,那么现在你要用一个类InheritInner继承Inner类,在继承过程中构造方法会被调用,即使你不写也会调用默认构造方法,但问题出现了,在调用父类Inner构造方法时找不到InnerOut的对象, 所以就必须给InheritInner类的构造方法传入InnerOut对象再通过io.super();方法调用Inner的默认构造方法,因为这是创建对象的基本流程,所以这句话io.super();是必须的。
create InnerOut
create Inner
从上面得出结论:
在调用构造方法InheritInner(new InnerOut());的时候,首先会调用外部类的构造器,然后这里的i.super()调用的是内部类的默认构造器。
class InnerOut { class Inner { public void print() { System.out.println("Inner"); } } } public class InheritInner extends InnerOut.Inner { InheritInner(){} //编译失败 InheritInner(InnerOut io) { io.super();// 必须有 } public static void main(String[] args) { Inner i = new InnerOut().new Inner(); i.print(); } }
要理解这个问题就得先理解内部类,Inner是InnerOut的内部类,那么一般的用法 InnerOut.Inner inner = new InnerOut(). new Inner() ;
我们可以看出要想创建Inner的对象必须先创建InnerOut的对象之后才能创建Inner对象,那么现在你要用一个类InheritInner继承Inner类,在继承过程中构造方法会被调用,即使你不写也会调用默认构造方法,但问题出现了,在调用父类Inner构造方法时找不到InnerOut的对象, 所以就必须给InheritInner类的构造方法传入InnerOut对象再通过io.super();方法调用Inner的默认构造方法,因为这是创建对象的基本流程,所以这句话io.super();是必须的。
class InnerOut { public InnerOut() { System.out.println("create InnerOut"); } class Inner { public Inner() { System.out.println("create Inner"); } public void print() { System.out.println("Inner"); } } } public class InheritInner extends InnerOut.Inner { InheritInner(InnerOut i) { i.super();// 必须有 } public static void main(String[] args) { InheritInner ii = new InheritInner(new InnerOut()); } }打印结果:
create InnerOut
create Inner
从上面得出结论:
在调用构造方法InheritInner(new InnerOut());的时候,首先会调用外部类的构造器,然后这里的i.super()调用的是内部类的默认构造器。
相关文章推荐
- Java中sleep(),wait(),yield()的区别
- 怎么设置myeclipse的格式化键格式每行的字符长度
- Java多线程系列1(概念和原理)
- Java数据类型和MySql数据类型对应表
- java读取jar包中的资源文件或properties配置文件路径的方法
- 重磅消息:JavaFX官方文档翻译完毕
- 重磅消息:JavaFX官方文档翻译完毕
- 从eclipse到Android studio/迁移eclipse的Android项目到Android studio平台的注意事项
- eclipse导出jar包的问题总结
- MAC下安装多版本JDK和切换几种方式
- 在eclipse中如何查找指定文文件
- Spring--开篇 (spring优缺点、模块组件、各个jar包详解)
- java slf4j的用法
- JAVA设计模式——装饰设计模式
- 关于eclipse的使用(导入项目-web)
- eclipse+jetty 配置jndi数据源
- thrift for java的使用
- 【Java】---异常处理
- Java Spring IOC用法
- udp协议基础(转自疯狂java讲义)