克隆对象时的默认行为是执行对象字段的浅表副本。在这种情况下,原始对象和克隆对象都保留对相同对象的引用。
此示例显示了该行为。
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)); }