1.为何Object中clone的修饰访问符是protected?
首先,protected的做用是让方法仅能被自身和子类调用。clone目的在于深拷贝,若是被拷贝的类中包含其余类,也必须被深拷贝,以下所示函数
class Person{ int salary; String name; Date birthDate; }
然而,当咱们调用的clone函数时Object中的时,它只好保证调用此函数的类的对象被深拷贝,其包含的类的对象只是浅拷贝。这时,若是属性中只包含基础类型和不可被修改的类对象还好(如int和String),改变a的值并不会影响b的值。spa
class Person{ int salary; String name; Date birthDate; public static void main(String[] args){ Person a = new Person(12,"a",new Date()); Person b = a.clone(); } }
可是,当咱们改变a中birthdate的值时,b中的birthdate也会随之改变,这显然违背了clone的初衷。这时咱们就须要重写clone,并将其访问修饰符改作public,以便外部类访问。那么这里就出现了第二个问题。code
2.为何要实现接口Cloneable中的clone方法而不是重写Object中的clone方法
其实上面已经给出了答案,为了让外部类也能访问clone方法,咱们须要将其访问修饰符改成public。可是若是是重写父类的方法,其访问修饰符不能超过有父类访问修饰符的范围大小,因此不可行。对象
一句话总结:为了实现让外界可访问且保证是深拷贝的clone方法,咱们将Object的clone设置为protected而且建立接口Cloneableblog