如何在Java中传递参数给对象的克隆函数

3

大家好:

我想知道如果我定义了一个实现了Cloneable接口的类:

public class cloneobj implements Cloneable {
    String name;
    public cloneobj (String name){
        this.name = name;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

}

我想知道如何给新的克隆对象命名?
谢谢

“给一个对象命名”是什么意思? - markspace
@markspace 就像调用构造函数一样 - Kuan
2
那么如果您不想克隆对象,克隆对象有什么意义呢? - markspace
@markspace因为我想保留其他字段,所以这个对象可能有除了名称以外的其他成员字段。 - Kuan
4
不应该使用克隆。创建一个新对象,手动复制字段。 - markspace
1个回答

2

自己编写 clone 方法:

public Object clone() throws CloneNotSupportedException {
    return new cloneobj(name);
}

编辑

如果你想调用super.clone();

public Object clone() throws CloneNotSupportedException {
    cloneobj cloned = (cloneobj)super.clone();
    cloned.name=this.name; //maybe (String)this.name.clone(); could be used
    return cloned;
}

谢谢,我对Java还很陌生。 :( 这意味着我不需要调用super.clone(),我以为super.clone可能会干一些隐藏的工作而不仅仅是构造函数... - Kuan
1
是的,你必须调用 super.clone() 否则它不会起作用。这个答案是错误的。 - markspace
@maskacovnik 谢谢,正如MarkSpace所说:“是的,你必须调用super.clone(),否则它不会起作用。答案是错误的”。你的编辑答案是为了纠正之前的答案还是两种方式都可以工作? - Kuan
我不确定是否需要调用super.clone()。这是一个本机方法,应该被调用,但另一方面,构造函数也应该创建副本以及克隆方法@Kuan(Object类的源代码在此处:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Object.java#Object.clone%28%29)。我还没有测试过我的任何示例... - maskacovnik
@maskacovnik 谢谢,我认为修改后的答案对我来说已经足够了。 - Kuan
cloned.name=this.name 是多余的,clone() 已经包含了这个操作。http://ideone.com/94gSTv - Radiodef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接