Java 如何复制对象(不是复制引用)

flowingfirefly 2012-05-29 11:47:36

public class CloneTest {
public static void main(String[] args) {
A a = new A();
A b = new A(3);
System.out.println(a.i);
System.out.println(b.i);
a = b.clone();
System.out.println(a.i);
b.i = 5;
System.out.println(b.i);
System.out.println(a.i);
}
}

class A implements Cloneable {
int i = 0;

A() {
}

A(int i) {
this.i = i;
}

public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}


运行时, 会出错, 错误信息如下:

/*
CloneTest.java:7: 不兼容的类型
找到: java.lang.Object
需要: A
a = b.clone();
^
1 错误
*/


为什么错了? 怎么改?
...全文
7588 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdojqy1122 2012-05-29
  • 打赏
  • 举报
回复

public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A();
A b = new A(3);
System.out.println(a.i);
System.out.println(b.i);
a = (A)b.clone();//要强转
System.out.println(a.i);
b.i = 5;
System.out.println(b.i);
System.out.println(a.i);
}
}

class A implements Cloneable {
int i = 0;
A() {
}
A(int i) {
this.i = i;
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
qybao 2012-05-29
  • 打赏
  • 举报
回复
super.clone()返回的是父类的克隆对象(也就是Object对象),不是子类的克隆对象,所以强行转换就会失败
public Object clone() throws CloneNotSupportedException {
//return super.clone();
//如果是浅克隆
return this; //直接返回对象本身
//如果是深克隆
//return new A(this.i); //重新生成一个对象,并用当前对象的属性初始化新对象
}


Lucy20180417 2012-05-29
  • 打赏
  • 举报
回复
因为我也没有做过clone的例子,只能大概猜一下原因.
楼主给的那个覆盖的clone方法,返回的应该是一个Object对象,不是一个A对象,楼主拿Object的子类的引用指向父类,所以就报错了!
sindhrcc 2012-05-29
  • 打赏
  • 举报
回复
你要是想改这个例子的话,就得强制转换。但是真正的克隆不是这么做的,是要实现Serilizable接口。然后把用输入输出流把类写到文件里再读出来,这样读出来的才是深克隆
BadPattern 2012-05-29
  • 打赏
  • 举报
回复
一个简单的编译错误,clone方法返回的是Object,你却把它赋值给A类的一个对象,所以需要强转一下:

try{
a = (A)b.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}

淡定的峰哥 2012-05-29
  • 打赏
  • 举报
回复
克隆方法是先调用父类的clone方法,再将本类对象的属性赋给要克隆的对象

public class Test implements Cloneable
{
int a = 0;

public static void main(String[] args) throws Exception
{
Test t = new Test();
t.a = 123;
Test t1 = (Test) t.clone();
System.out.println(t1 == t);
System.out.println(t1.a);
}

@Override
public Object clone()
{
try
{
Test t = (Test) super.clone();
t.a = this.a;
return t;
}
catch (CloneNotSupportedException e)
{
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
}

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧