ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 深拷贝,浅拷贝,克隆

2019-09-15 15:01:00  阅读:171  来源: 互联网

标签:java clone


我需要澄清深度拷贝,浅拷贝和Java中的克隆之间的区别

解决方法:

不幸的是,“浅拷贝”,“深拷贝”和“克隆”都是相当不明确的术语.

在Java上下文中,我们首先需要区分“复制值”和“复制对象”.

int a = 1;
int b = a;     // copying a value
int[] s = new int[]{42};
int[] t = s;   // copying a value (the object reference for the array above)

StringBuffer sb = new StringBuffer("Hi mom");
               // copying an object.
StringBuffer sb2 = new StringBuffer(sb);

简而言之,对类型为引用类型的变量的引用的赋值是“复制值”,其中值是对象引用.要复制一个对象,某些东西需要使用new,无论是显式还是底层.

现在是对象的“浅”与“深”复制.浅拷贝通常意味着只复制对象的一个​​级别,而深度复制通常意味着复制多个级别.问题在于决定一个级别的含义.考虑一下:

public class Example {
    public int foo;
    public int[] bar;
    public Example() { };
    public Example(int foo, int[] bar) { this.foo = foo; this.bar = bar; };
}

Example eg1 = new Example(1, new int[]{1, 2});
Example eg2 = ... 

正常的解释是eg1的“浅”副本将是一个新的Example对象,其foo等于1,其bar字段指的是与原始数据相同的数组;例如

Example eg2 = new Example(eg1.foo, eg1.bar);

对eg1的“深”副本的正常解释将是一个新的Example对象,其foo等于1并且其bar字段指的是原始数组的副本;例如

Example eg2 = new Example(eg1.foo, Arrays.copy(eg1.bar));

(来自C/C++背景的人可能会说引用赋值会产生浅拷贝.但是,这不是我们通常在Java上下文中浅层复制的意思……)

还存在另外两个问题/不确定领域:

>深度有多深?它停在两个级别吗?三个级别?它是否意味着连接对象的整个图形?
>封装数据类型怎么样;例如一个字符串? String实际上不只是一个对象.实际上,它是一个带有一些标量字段的“对象”,以及对一个字符数组的引用.但是,API完全隐藏了字符数组.因此,当我们谈论复制字符串时,将其称为“浅”副本还是“深度”副本是否有意义?或者我们应该把它称为副本?

最后,克隆.克隆是一种存在于所有类(和数组)上的方法,通常被认为是生成目标对象的副本.然而:

>这种方法的规范故意没有说明这是浅层还是深层(假设这是一个有意义的区别).
>实际上,规范甚至没有明确规定克隆产生新对象.

这是the javadoc所说的:

“Creates and returns a copy of this object. The precise meaning of “copy” may depend on the class of the object. The general intent is that, for any object x, the expression x.clone() != x will be true, and that the expression x.clone().getClass() == x.getClass() will be true, but these are not absolute requirements. While it is typically the case that x.clone().equals(x) will be true, this is not an absolute requirement.”

请注意,这就是说克隆可能是目标对象的一个​​极端,而在另一个极端,克隆可能与原始对象不同.这假设甚至支持克隆.

简而言之,克隆可能意味着每个Java类都有不同的东西.

有些人认为(正如@supercat在评论中所做的那样)Java clone()方法已被破坏.但我认为正确的结论是克隆的概念在OO的背景下被打破了.在AFAIK中,不可能开发出一种统一的克隆模型,该模型在所有对象类型中都是一致的和可用的.

标签:java,clone
来源: https://codeday.me/bug/20190915/1805056.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有