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的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

关于JS的clone()函数编写的一些问题

201521123117 《Java程序设计》第6周学习总结

java.lang.Object 之 clone() 使用

浅谈关于java中的深浅拷贝

Java中clone方法的使用

java.lang.Object 之 clone() 深拷贝,浅拷贝