Java克隆执行浅拷贝

示例

克隆对象时的默认行为是执行对象字段的浅表副本。在这种情况下,原始对象和克隆对象都保留对相同对象的引用。

此示例显示了该行为。

import java.util.List;

public class Sheep implements Cloneable {

    private String name;

    private int weight;

    private List<Sheep> children;

    public Sheep(String name, int weight) {
       this.name= name;
       this.weight= weight;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public List<Sheep> getChildren() {
        return children;
    }

    public void setChildren(List<Sheep> children) {
       this.children= children;
    }

}

import java.util.Arrays;
import java.util.List;

// 创造一只羊
Sheep sheep = new Sheep("Dolly", 20);

// 创造孩子
Sheep child1 = new Sheep("Child1", 4);
Sheep child2 = new Sheep("Child2", 5);

sheep.setChildren(Arrays.asList(child1, child2));

// 克隆羊
Sheep dolly =  (Sheep) sheep.clone();
List<Sheep> sheepChildren = sheep.getChildren();
List<Sheep> dollysChildren = dolly.getChildren();
for (int i = 0; i < sheepChildren.size(); i++) {
    // 打印为true,两个数组都包含相同的对象
    System.out.println(sheepChildren.get(i) == dollysChildren.get(i));
}