接口
- 如果类遵从某个特定接口,就履行这项服务
e.g. 实现Comparable接口的Array可以使用sort方法 - 接口中的方法自动属于public
- 接口中可以定义常量,但不能含有实例域、也不能在接口中实现方法
- 可以声明接口的变量,引用实现了接口的类对象
- 接口可以提供多重继承的好处,避免多重继承的复杂与低效
对象克隆
- 拷贝: 原始变量与拷贝变量引用同一个对象
- 克隆:默认浅拷贝,并没有克隆对象中的内部对象。要实现深拷贝,需要重新定义clone方法
- 即使clone的默认实现(浅拷贝)能满足需求,也应该实现Cloneable接口
- 必须谨慎实现子类的克隆
*接口与回调
内部类
使用原因:
- 可以访问该类定义所在的作用域中的数据,包括私有数据
- 对同一个包的其他类隐藏
- 使用匿名内部类方便编写回调函数
使用内部类访问对象状态
- 并不是每个外部类对象都有一个内部类实例域
- 内部类既可以访问自身的数据域,也可以访问创建他的外部类对象的实例域,即存在一个隐式引用
- 外围类的引用在构造器中设置,编译器修改了所有内部类的构造器,添加一个外围类引用的参数
- 只有内部类可以是私有类,常规类只可以具有包可见性或者公有可见性
局部内部类
- 在方法中定义局部类
- 对外部世界完全隐藏,除了所在的方法,没有其他方法知道其存在
- 可以访问声明为final的局部变量(参数),减少了需要显示编写的实例域
- final保证局部变量与在局部类内部建立的拷贝保持一致
- final但需要更新:可以使用长度为1的数组替代
匿名内部类
invite( new ArrayList<String>() {{ add("Harry"), add("Tony") }} );
静态内部类
- 静态内部类的对象除了没有生成对其外部类对象的引用外,与其他内部类相同
*代理
- 代理类是在程序运行过程中创建的
- 代理类只有一个实例域——调用处理器
- 代理类一定是public和final