对于所有的基本类型都是浅拷贝,不论什么方式;
但对于引用类型,当调用object的clone方法时,除String类型外,其他都为深拷贝;对于String对象类型要实现深拷贝必须要手动创建(new)一个新的String对象;
public class CloneAbleDemo { public static void main(String[] args) throws CloneNotSupportedException { CloneAbleImpl cloneAble = new CloneAbleImpl(1); cloneAble.setS("1"); // 如果当前类未实现CloneAble接口,则会直接抛出CloneNotSupportedException异常信息 CloneAbleImpl clone = cloneAble.clone(); System.out.println(clone.getValue()); //结果为false,深拷贝 System.out.println(cloneAble == clone); // 当为浅拷贝时,结果为true // 数据流程为 cloneAble对象的s字段 -> clone对象的s字段; 对于String类型的复制实际默认是浅拷贝 System.out.println(cloneAble.getS() == clone.getS()); // 当为深拷贝时,上述结果为false,而当前结果为true System.out.println(cloneAble.getS().equals(clone.getS())); } } class CloneAbleImpl implements Cloneable { private final int value; private String s; CloneAbleImpl(int value) { this.value = value; } public int getValue() { return this.value; } public String getS() { return this.s; } public void setS(String s) { this.s = s; } /** * 重写object中的clone方法,并修改object中的clone的返回值和访问性 * * @return * @throws CloneNotSupportedException */ @Override public CloneAbleImpl clone() throws CloneNotSupportedException { CloneAbleImpl cloneAble = (CloneAbleImpl) super.clone(); // 深拷贝,创建了一个新的String对象,对于s而言此时就是深拷贝 cloneAble.setS(new String(this.s)); return cloneAble; } }
原文:https://www.cnblogs.com/xingguoblog/p/13652168.html