导航:首页 > 编程语言 > java克隆类对象

java克隆类对象

发布时间:2023-09-13 11:35:38

‘壹’ java中深克隆与浅克隆的区别

深克隆与浅克隆
大家知道,对象是互相引用的,即对象中可能包含了另一个对象的引用,举例如:有一个Order对象,Order对象中又包含了LineItems对象,然后LineItems对象又包含了Item对象。
好了,现在我有一个Order对象order1,它包含了一个LineItems对象items,这表示的是有一个订单order1,订单的内容是items。
好的,现在有另一个客户想要一份订单,内容跟order1完全一样,那么在系统的逻辑层我们怎么做呢?很简单,order2=order1.clone().我们知道clone方法是在内存中生成一个新的对象,而不是只得到原对象的引用。这时候,有人说话了:“哦,明白了我们对order2的成员变量进行修改,是不会影响order1的。”很可惜,这句话只对了一半。
假设order类有一个成员变量name,当然改变order2.name不会影响order1.name,因为他们在不同的内存区域。但是如果改变order1.items呢?很遗憾,简单地使用order1.clone,是会影响到order2.items的。原因很简单,就是因为clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,items对象在内存中只有一个,order1和order2都指向它,任何一个对象对它的修改都会影响另一个对象。
那相对浅克隆,深克隆自然就是会克隆对象引用的对象了。也就是说,在上例中,改变order1.items并不会影响order2.items了。因为内存中有两个一样的items。
如果实现深克隆?
一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。绝!
这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。

‘贰’ 如何克隆Java对象

Java中的对象涉及使用引用类型,没有直接的方法可将一个对象的内容复制到一个新对象中。将一个引用分配给另一个引用只会给相同对象建立另一个引用。因此,Java对所有引用类型使用一个特殊的clone()方法,为对象复制自身提供一个标准的机制。以下是你需要了解和克隆Java对象有关的细节。为何建立一个本地拷贝?给一个对象建立本地拷贝的原因很可能是由于你计划修改该对象,并且你不想修改方法调用者的对象。如果你确定你需要一个本地拷贝,你可以使用Object类的clone()方法来执行这项操作。clone()方法被定义为受保护方法,但你必须在你希望克隆的所有子类中重新公开定义它。例如,标准库类ArrayList忽略clone(),但你可以这样为ArrayList调用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1’s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一个Object,它必须重新转变为适当的类型。这个例子说明ArrayList的clone()方法如何不能自动克隆ArrayList包含的每一个对象?原有ArrayList和克隆后的ArrayList是相同对象的别名。这种情况通常叫做浅拷贝,因为它仅仅复制一个对象的“表面”部分。实际的对象由这个“表面”,引用指向的所有对象,以及那些对象指向的所有对象等构成。这往往被称作“对象网络”。下一页>>

‘叁’ Java中是如何实现克隆

java 实现clone对象方法的步骤如下:
(1)实现Cloneable接口
(2)重载Object类中的clone()方法,重载时需定义为public
(3)在重载方法中,调用super.clone()
例如:
class CloneClass implements Cloneable {
public int aInt;

public Object clone() {
CloneClass o = null;
try {
o = (CloneClass) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return o;
}

阅读全文

与java克隆类对象相关的资料

热点内容
奔腾t55压缩比 浏览:620
python不弹出cmd窗口 浏览:921
cad解压不到e盘 浏览:709
phpfopen用法 浏览:805
cuda文件和cpp混合编译 浏览:191
鸿蒙自带主题在哪个文件夹 浏览:941
c写一个简单的中文编译器 浏览:413
反编译图片怎么弄 浏览:100
水空调需要压缩机吗 浏览:824
h3cdns配置命令 浏览:735
曹操传找不到视频解压文件 浏览:939
zblogphp插件 浏览:649
好兴动app怎么掌上取现 浏览:133
python折旧率 浏览:539
涟源云服务器 浏览:992
linux中代表什么 浏览:33
androidphone模块 浏览:35
linux中断表 浏览:177
文本写的java如何编译运行 浏览:524
单片机pwm控制舵机 浏览:318