java - java clone() 是如何真正使用浅拷贝的?
问题描述
我知道它可能已经被问过了,但我的问题是不同的。我已经搜索过,我知道 java 方法object.clone()
使用浅拷贝,这意味着复制引用而不是实际对象。假设我有一个狗类
Class Dog{
public Dog(String name, DogTail tail, DogEar ear){
this.name = name;
this.tail = tail;
this.ear = ear;
}
}
DogTail t = new DogTail();
DogEar ear = new DogEar();
Dog dog1 = new Dog("good", t,ear);
假设我想获得 dog1 的副本。
狗 dognew = dog1.clone();
如果此clone()
方法使用浅拷贝,则意味着复制引用。因此,如果我更改上面创建的 t 对象或 ear 方法,它会在 dognew 对象中更改,反之亦然。这种克隆效果如何?这个问题的产生是因为有人说创建一个巨大的对象比克隆更糟糕,因为你在使用clone()
方法时会节省性能。
解决方案
方法的默认版本clone()
创建对象的浅表副本。
对象的浅拷贝将具有原始对象所有字段的精确副本。如果原始对象具有对其他对象的任何引用作为字段,则仅将这些对象的引用复制到克隆对象中,不会创建这些对象的副本。这意味着通过克隆对象对这些对象所做的任何更改都将反映在原始对象中,反之亦然。
要创建对象的深层副本,您可以覆盖该clone()
方法。
protected Object clone() throws CloneNotSupportedException
{
DogTail tail = (DogTail) this.tail.clone();
Dog dog = (Dog) super.clone();
dog.tail = tail;
return dog;
}
推荐阅读
- javascript - 测试一个使用 setTimeout 和 Jest 的函数:为什么这个测试失败了?
- ios - 如何将 TableViewCell 中的数据作为按钮执行?
- ios - 应用程序从一个 Apple 开发者帐户转移到另一个帐户的后果是什么?
- python-3.x - 使用 Python 和 pygerrit2 库从 Power BI Desktop 对 Gerrit 进行 API 调用
- wordpress - 滚动WordPress时的粘性菜单
- cassandra - 如何为多个节点生成 murmur3Partitioner 的令牌?
- reactjs - 无法从“setupTests.ts”中找到模块“酶”
- scheme - 列表的 cdr 是否总是 eqv?
- java - 用java制作.io风格游戏的最佳方法?
- python - 分配给 DataFrame 不起作用,但 dtypes 已更改