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

其他方法实现深拷贝

反射 也能实现。

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