我从互联网上读到了一段关于克隆的内容.但是我不太明白,所以有人可以清楚地解释清楚吗?
如果类具有final字段,则无法在clone方法中为这些字段指定值.这会导致正确初始化对象的最终字段时出现问题.如果最后一个字段指的是对象的某个内部状态,那么克隆的对象最终会共享内部状态,这对于可变对象肯定是不正确的.
供参考,这里是链接:http: //www.jusfortechies.com/java/core-java/cloning.php
Dav*_*Far 19
o.clone()调用Object.clone(),它的内存副本o.此后,复制的引用不能更改为最终字段,因此我们有非自愿的别名;o发生变化,克隆也会不由自主地改变;我相信这篇文章是clone()通过clone-chaining(via super.clone())讨论的,最终Object.clone()被调用,这使得通过本机代码克隆的对象的平面内存副本.
假设我们有以下示例(来自下面提到的博客文章):
public class Person implements Cloneable
{
private final Brain brain; // brain is final since I do not want
// any transplant on it once created!
// ...
}
Run Code Online (Sandbox Code Playgroud)
和
person2 = (Person) person1.clone();
Run Code Online (Sandbox Code Playgroud)
然后,person2与field1具有相同的字段大脑内存部分,即两者对同一个大脑具有相同的引用.然后,由于Person对象是可变的,他们可以学习东西:
person1.learn(dvorakTyping);
Run Code Online (Sandbox Code Playgroud)
然后神奇地,person2也可以在dvorak键盘上输入.对于不可变对象,这个问题不会发生(尽管克隆仍然存在问题,因为最终字段仍然无法通过参数初始化,如在构造函数中).
我上半句的原因是:你可以通过调用对象的一个构造函数来实现clone.有些人声称这是违反克隆合同的,但事实并非如此.这是一篇很好的博客文章,讲述为什么要在克隆中调用构造函数(一个主要原因是那些最终字段).
阅读Hemal对mre答案的评论,我瞥了一眼博客文章引用的问题,事实证明,该帖子复制了我引用的博客文章中的一些句子,但没有很好的代码示例.大声笑.
| 归档时间: |
|
| 查看次数: |
4836 次 |
| 最近记录: |