对象克隆的建立一个本地拷贝

 我来答
莫邪6躨
2016-06-05 · TA获得超过103个赞
知道答主
回答量:80
采纳率:100%
帮助的人:6.2万
展开全部

给一个对象建立本地拷贝的原因很可能是由于您计划修改该对象,并且您不想修改方法调用者的对象。假如您确定您需要一个本地拷贝,您能够使用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是相同对象的别名。
这种情况通常叫做浅拷贝,因为他仅仅复制一个对象的“表面”部分。实际的对象由这个“表面”,引用指向的任何对象,连同那些对象指向的任何对象等构成。这往往被称作“对象网络”。假如您拷贝任何这些内容,则被称为深拷贝。例如:
class DeeplyClone
{
public static void main(String[] args)
{
Professor p=new Professor(feiyang,23);
Student s1=new Student(zhangshan,18,p);
Student s2=(Student)s1.clone();
s2.p. name=Bill.Gates;
s2.p.age=30;
System.out.println(name=+s1.p. name+,+age=+s1.p.age);
}
}
class Professor implements Cloneable
{
String name;
int age;
Professor(String name,int age)
{
this. name=name;
this.age=age;
}
public Object clone()
{
Object o=null;
try
{
o=super.clone();
}
catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
return o;
}
}
class Student implements Cloneable
{
Professor p;
String name;
int age;
Student(String name, int age,Professor p)
{
this. name=name;
this.age=age;
this.p=p;
}
public Object clone()
{
//Object o=null;
Student o=null;
try
{
o=(Student)super.clone();
}
catch(CloneNotSupportedException e)
{
e.printStackTrace();
}
return o;
}
}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式