Java学习关于Object的clone的一些问题
Posted oliver1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习关于Object的clone的一些问题相关的知识,希望对你有一定的参考价值。
1.为什么Object中clone的修饰访问符是protected?
首先,protected的作用是让方法仅能被自身和子类调用。clone目的在于深拷贝,如果被拷贝的类中包含其他类,也必须被深拷贝,如下所示
class Person int salary; String name; Date birthDate;
然而,当我们调用的clone函数时Object中的时,它只好保证调用此函数的类的对象被深拷贝,其包含的类的对象只是浅拷贝。这时,如果属性中只包含基础类型和不可被修改的类对象还好(如int和String),改变a的值并不会影响b的值。
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,以便外部类访问。那么这里就出现了第二个问题。
2.为什么要实现接口Cloneable中的clone方法而不是重写Object中的clone方法
其实上面已经给出了答案,为了让外部类也能访问clone方法,我们需要将其访问修饰符改为public。但是如果是重写父类的方法,其访问修饰符不能超过有父类访问修饰符的范围大小,所以不可行。
一句话总结:为了实现让外界可访问且保证是深拷贝的clone方法,我们将Object的clone设置为protected并且创建接口Cloneable
以上是关于Java学习关于Object的clone的一些问题的主要内容,如果未能解决你的问题,请参考以下文章