java如何克隆一个对象_如何修改java中的克隆对象

若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克隆”的意思,即制作完全一模一样的副本。这个方法在基础类Object中定义成“protected”(受保护)模式。但在希望克隆的任何衍生类中,必须将其覆盖为“public”模式。例如,标准库类Vector覆盖了clone(),所以能为Vector调用clone(),如下所示:

5d1efb2ba879b9ecda47c4544b1290a6.png

//: Cloning.java

// The clone() operation works for only a few

// items in the standard Java library.

import java.util.*;

class Int {

private int i;

public Int(int ii) { i = ii; }

public void increment() { i++; }

public String toString() {

return Integer.toString(i);

}

}

public class Cloning {

public static void main(String[] args) {

Vector v = new Vector();

for(int i = 0; i < 10; i++ )

v.addElement(new Int(i));

System.out.println("v: " + v);

Vector v2 = (Vector)v.clone();

// Increment all v2's elements:

for(Enumeration e = v2.elements();

e.hasMoreElements(); )

((Int)e.nextElement()).increment();

// See if it changed v's elements:

System.out.println("v: " + v);

}

} ///:~

clone()方法产生了一个Object,后者必须立即重新造型为正确类型。这个例子指出Vector的clone()方法不能自动尝试克隆Vector内包含的每个对象——由于别名问题,老的Vector和克隆的Vector都包含了相同的对象。我们通常把这种情况叫作“简单复制”或者“浅层复制”,因为它只复制了一个对象的“表面”部分。实际对象除包含这个“表面”以外,还包括句柄指向的所有对象,以及那些对象又指向的其他所有对象,由此类推。这便是“对象网”或“对象关系网”的由来。若能复制下所有这张网,便叫作“全面复制”或者“深层复制”。

在输出中可看到浅层复制的结果,注意对v2采取的行动也会影响到v:

v: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

v: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

一般来说,由于不敢保证Vector里包含的对象是“可以克隆的,所以最好不要试图克隆那些对象。

②:“可以克隆”用英语讲是cloneable,请留意Java库中专门保留了这样的一个关键字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值