接口
定义了一组对类的需求。实现接口的类,必须要实现接口内定义的方法。书中举例为,需要调用Arrays.sort()方法的类必须实现Comparable接口,而实现Comparable接口的类必须要实现Comparable接口中包含的compareTo方法。当然通常接口都定义了不止一个方法,也就是说实现接口的类通常必须要实现多个接口中定义的方法。
接口的特性
1、接口中的所有方法自动地属于public,所以定义接口的方法时,不需要加访问控制关键字。
2、接口不是类,不可以用new来实例化接口。但可以声明接口变量。接口变量只能引用实现了接口的类。注:这点与抽象类相似,抽象类无法被实例化,但却可以声明该类变量且只能引用其子类对象。
3、可以使用instanceof 检查一个对象是否实现某接口,如同检查一个对象是否属于某个特定类一样。
4、接口之间也有继承关系。接口虽然不能包含实例域和静态方法,却可以包含常量且被自动设为public static final。
5、一个类可以实现多个接口,却只能继承一个父类。因此,接口提供了多重继承的大多数好处,同时还能避免多重继承的复杂性和低效性。
克隆
原始的clone()方法提供的浅拷贝,只关注被复制的对象,却不关注复制对象所引用的对象。因此经过浅拷贝后得到的对象,与原对象是地址空间不同的对象,但它们引用的对象却依旧是同一地址空间的。为实现深拷贝,一般需要重写clone()方法,即实现Cloneable接口。
即使clone方法的浅拷贝已经能够满足要求,同样也需要实现Cloneable接口。重写clone方法,并将其改为public,在方法内部引用super.clone()即可。