Interface 特性
接口不允许有Instance Field和Static Methods,所有方法自动为public,所有field自动为public static final
Interface引用可以指向实现它的类的对象
Comparable x = new Employee();
可用Instanceof判断一个对象的所属类是否实现了该接口
if(x instanceof Comparable)
Interface和AbstractClass
1.继承:后者当中可以存在函数的实现,前者完全就是一个虚方法的集合
继承一个抽象类后可以实现一部分方法,继续当抽象类,实现一个接口必须实现它的所有方法
2.实例化和field:两者都不可以实例化,但后者可以拥有它的InstanceField和StaticField,前者的Field自动为public static final的类常量
3.method:两者都不可以声明或实现static方法,但是后者可以包括除private以外的方法,前者自动为public方法
Clonable接口与Clone
Clone是Object类中的protected方法,在不同包的其它类中不可以使用
protected native Object clone() throws CloneNotSupportedException;
如果该类没有实现Clonable接口则抛出异常,Clonable作为一个标签接口,代表该类已经准备好在其他类中进行Clone()了
该代码会报错The method clone() from the type Object is not visible,因为BridgeMeExp中没有重写Clone()方法
,并将它改为public。所以该方法在其他类不可用
public class InterfaceExp implements Cloneable,Comparable<InterfaceExp> {
private String TestName;
int num;
BridgeMeExp exp;
public InterfaceExp(String testName, int num,BridgeMeExp exp) {
super();
TestName = testName;
this.num = num;
this.exp = (BridgeMeExp)exp.clone();//compile time error
}
深拷贝与浅拷贝
浅拷贝的典型例子就是引用间的赋值
Employee original = new Employee("John Public", 50000);
Employee copy = original;
copy.raiseSalary(10); // oops--also changed original
Employee copy = original.clone();
copy.raiseSalary(10); // OK--original unchanged
深拷贝则要调用实现Cloneale类的clone()函数
Clone函数的实现
对不可变类的引用不用更改,多个引用指向同一个不可变对象也问题不大
class Employee implements Cloneable
{
public Employee clone() throws CloneNotSupportedException {
// call Object.clone()
Employee cloned = (Employee) super.clone();
// clone mutable fields
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
}