首页 / JAVA / java – 深拷贝,浅拷贝,克隆
java – 深拷贝,浅拷贝,克隆
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 深拷贝,浅拷贝,克隆,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2684字,纯文字阅读大概需要4分钟。
内容图文
![java – 深拷贝,浅拷贝,克隆](/upload/InfoBanner/zyjiaocheng/716/16df0df37a104b6297cd829c6baea5df.jpg)
我需要澄清深度拷贝,浅拷贝和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 expressionx.clone().getClass() == x.getClass()
will be true, but these are not absolute requirements. While it is typically the case thatx.clone().equals(x)
will be true, this is not an absolute requirement.”
请注意,这就是说克隆可能是目标对象的一个??极端,而在另一个极端,克隆可能与原始对象不同.这假设甚至支持克隆.
简而言之,克隆可能意味着每个Java类都有不同的东西.
有些人认为(正如@supercat在评论中所做的那样)Java clone()方法已被破坏.但我认为正确的结论是克隆的概念在OO的背景下被打破了.在AFAIK中,不可能开发出一种统一的克隆模型,该模型在所有对象类型中都是一致的和可用的.
内容总结
以上是互联网集市为您收集整理的java – 深拷贝,浅拷贝,克隆全部内容,希望文章能够帮你解决java – 深拷贝,浅拷贝,克隆所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。