本文介绍了深拷贝,浅拷贝,克隆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我需要澄清深拷贝,浅拷贝和克隆在Java中的区别解决方案不幸的是,浅拷贝,深拷贝和克隆都是相当不明确的术语。 在Java环境中,我们首先需要区分复制值和复制对象。 int a = 1; int b = a; //复制值 int [] s = new int [] {42}; int [] t = s; //复制一个值(上面数组的对象引用) StringBuffer sb = new StringBuffer(嗨妈妈); //复制一个对象。 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; }; } 示例eg1 = new示例(1,new int [] {1,2}); 示例eg2 = ... 正常的解释是浅副本 eg1 将是一个新的示例对象,其 foo 等于1并且其 bar 字段引用与原始字段相同的数组;例如。 示例eg2 = new示例(eg1.foo,eg1.bar); 深层副本的正常解释eg1 将是一个新的示例对象,其 foo 等于1且其栏字段是指原始数组的副本;例如。 示例eg2 = new示例(eg1.foo,Arrays.copy(eg1.bar)); (来自C / C ++背景的人可能会说出一个参考赋值产生一个浅的副本。但是,这不是我们通常在Java上下文中浅层复制的意思...) 还存在两个不确定的问题/领域: / p> 深度有多深?它停在两个级别吗?三个级别?它是否意味着连接对象的整个图形? 封装数据类型如何;例如一个字符串? String实际上不仅仅是一个对象。实际上,它是一个带有一些标量字段的对象,以及对一个字符数组的引用。但是,API完全隐藏了字符数组。因此,当我们谈论复制字符串时,将其称为浅副本还是深度副本是否有意义?或者我们应该把它称为副本? 最后,克隆。克隆是一种存在于所有类(和数组)上的方法,通常被认为是生成目标对象的副本。但是: 此方法的规范故意没有说明这是浅拷贝还是深拷贝(假设这是有意义的区别)。 事实上,规范甚至没有具体说明克隆产生了一个新对象。 这是 javadoc 说:Note, that this is saying that at one extreme the clone might be the target object, and at the other extreme the clone might not equal the original. And this assumes that clone is even supported.In short, clone potentially means something different for every Java class.Some people argue (as @supercat does in comments) that the Java clone() method is broken. But I think the correct conclusion is that the concept of clone is broken in the context of OO. AFAIK, it is impossible to develop a unified model of cloning that is consistent and usable across all object types. 这篇关于深拷贝,浅拷贝,克隆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云! 06-19 18:49