这篇讲讲内部类的设计思路,为什么Sun公司要苦心积虑的设计出这个内部类呢?原因如下
1.逻辑包含
如果A类在逻辑上包含B类,那么可以将B类设置为A类的内部类,比如OW(守望先锋)类可以作为FPS(第一人称射击)类的内部类:
public class FPS {
public class OW{}
}
设置内部类修饰符为private,此时内部类只能被外部类调用:
public class FPS {
private class OverWatch{}
}
2. 多重继承实现
每个内部类都能独立的继承一个接口,无论外部类是否已经继承了某个接口的实现,对于内部类都没影响
内部类提供可以继承多个抽象类或具体的类的能力
示例(子类利用多重继承来继承父亲的身高和母亲的美貌)
定义父类
定义母类
定义子类
写一个调用方法
输出结果
3. 闭包与回调
闭包是一个可调用的对象,记录了一些信息,这些信息来自于创建它的作用域
通过这个定义,可以看出内部类是面向对象的闭包,它不仅包含外部类对象(创建内部类的作用域)的信息
还自动拥有一个指向此外部类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员
例如:一个基类A和一个接口B都有一个相同的方法C,相同的方法名,但含义截然不同,这时就需要闭包
基类A
接口B
闭包实现:
Ason继承自 A, 直接实现A类的C()方法,然后使用内部类BInner实现接口的C()方法回调D()方法,这样就有两种意义的C方法。
如果Ason同时继承自 A且实现 B接口,就不能同时实现A和B的不同的 C()方法:
下一篇讲讲内部类的各种相关概念,比如匿名内部类和私有内部类等