Clone所需要了解的

爲什麼要使用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

其他方法實現深拷貝

反射 也能實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章