爲什麼要使用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
其他方法實現深拷貝
反射 也能實現。