【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

猜你喜欢

转载自www.cnblogs.com/Oliver1993/p/11470505.html