Interface
1. 接口的概念?
接口不是类,而是对类的一组需求描述。
如果类遵从某个特定接口,那么就要履行这项服务
2. 接口的组成?
所有方法自动public
不允许含有实例域
不能在接口中实现方法
可以定义常量
3. 反对称规则
n Java语言中有这样一个接口:
n 语言标准规定:
对于任意的x和y,必须保证:sgn(x.compareTo(y) ) = -sgn( y.compareTo(x) );
(如果前者抛出异常,后者也应抛出异常)
n 在继承中,便会有如下问题出现:
Manager类拓展了Employee类,Employee类实现了Comparable<Employee>
如果Manager类覆盖了compareTo方法,就要特别注意类型转换的问题
n 上述代码违反了反对称规则
employee.compareTo(manager);//没毛病
manager.compareTo(employee);//抛出ClassCastException异常
n 解决方案:
4. 接口的特性?
接口不是类,不能被实例化( new );
可以声明一个接口的变量,必须引用实现了该接口的类对象;
可以使用instanceof检查一个对象是否实现了某个特定的接口;
接口可以被拓展;
借口不能包含实例域和静态方法,但可以包含常量( 自动public static final );
5. 接口和抽象类的比较?
组成:·
| 实例域 | 具体方法 | 静态方法 | 静态常量 |
抽象类 | 可以有 | |||
接口 | 不可以 | 可以有 |
拓展性:一个类只能继承一个抽象类,却能实现多个接口
功能:
抽象类提供通用方法和实例域,通常作为顶层基类,定义一个家族类的默认行为;
接口提供特定服务供其他类实现。同时,接口提供了一种抽象,能更好的定义类型,有助于后面实现多态机制。
6. 对象克隆
1. 为什么要克隆?
2. 浅克隆(默认)
n 不克隆对象中的内部对象
n 如果在对象中包含了子对象的引用,浅拷贝的结果会使两个域引用同一个子对象,因此原始对象和克隆对象共享这部分信息
n 如果子对象是不可变对象,例如String对象,不会产生任何问题;
3. 深克隆
子对象常常可变,这就需要我们重新定义clone方法,以实现对子对象的拷贝
4. 我们在克隆前需要想清楚以下问题:
a) 默认的clone方法能否满足要求
b) 默认的clone方法是否能够通过调用可变子对象的clone方法得到修补
c) 是否不应该使用clone方法
5. Object的clone方法
受保护方法(protected):
protected native Object clone() throws CloneNotSupportedException;
6. Cloneable接口
public interface Cloneable { }
明确:
1. Cloneable接口是一个tagginginterface,与接口的使用没有任何关系。毕竟clone方法是从Object类继承过来的。接口只是作为一个tagger,表明类设计者知道要进行克隆处理
2. tagging interface:
n 没有方法;
n 可以使用instanceof进行类型检查:某个对象是否实现了该接口
7. 浅拷贝的实现
8. 深拷贝的实现
说明:只要在clone方法中含有没有实现Cloneable接口的对象,当然,这里的Employee和Date类都已经实现了Cloneable,因此不会抛出异常。但是编译器并不知道,因此,需要声明异常。
9. 为什么我们要慎用克隆?
7. 接口与回调