为什么要使用clone()
主要对需要克隆的对象进行深拷贝,从而操作拷贝对象不影响原克隆对象
clone() 与 new () 比较
相同点
都需要开辟新的内存空间
不同点
- new()需要通过构造函数,来填充数据域,完成初始化
- clone()则不需要调用构造函数,根据被克隆的属性来填充数据域
使用clone
需要实现Cloneable,重写clone方法
clone实现浅拷贝与深拷贝
浅拷贝
浅拷贝:拷贝的仅仅是值,对于子对象没有开辟新的内存
public class Animal implements Cloneable {
private String name;
private Food food;
public Animal() {
}
public Food getFood() {
return food;
}
public void setFood(Food food) {
this.food = food;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Animal clone() throws CloneNotSupportedException {
return (Animal) super.clone();
}
}
public class Food {
private String foodName;
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Animal animal = new Animal();
animal.setName("喵喵");
Food food = new Food();
food.setFoodName("鱼鱼鱼");
animal.setFood(food);
Animal clone = animal.clone();
System.out.println(clone.equals(animal));
System.out.println(clone.getFood().equals(animal.getFood()));
}
false
true
深拷贝
深拷贝: 被克隆对象和子对象都实现Cloneable,和重写clone方法,其子对象会分配新的内存空间
public class Food implements Cloneable{
.......
@Override
public Food clone() throws CloneNotSupportedException {
return (Food) super.clone();
}
}
public class Animal implements Cloneable {
.......
@Override
public Animal clone() throws CloneNotSupportedException {
Animal clone = (Animal) super.clone();
clone.setFood(this.food.clone());
return clone;
}
}
Animal clone = animal.clone();
System.out.println(clone.equals(animal));
System.out.println(clone.getFood().equals(animal.getFood()));
false
false
其他方法实现深拷贝
反射 也能实现。