为java中的对象分配相同的值

时间:2012-07-19 10:48:09

标签: java object clone

让我们假设有两个类abc

的对象

abc obj = new abc(10,20); //设置两个var的值。说x和y

abc obj1 = obj; //指向相同的内存,所以值相同

但是如果有一种方法我可以将一个对象的值分配给另一个对象,两者都有差异。记忆。简单地说我希望复制的值不是地址。任何运营商或其他什么都可以做到这一点?

7 个答案:

答案 0 :(得分:3)

您可以使用clone()方法(假设子类实现java.lang.Cloneable接口)

abc obj1 = obj.clone()

请记住clone()的默认行为是返回对象的浅表副本。这意味着所有原始对象的字段的值都将复制到新对象的字段中(它不会遍历其他对象的整个图形)。

我想“深度复制”您可以序列化和反序列化的对象。

深层复制为每个对象的字段创建一个不同的副本,递归通过正在复制的对象引用的其他对象的整个图形

更多信息:

http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

答案 1 :(得分:2)

如果使用clone()方法,则必须实现Cloneable接口并为此方法编写自己的实现。我认为最好在你的类中创建一个拷贝构造函数并使用它。

例如:

public class YourClass() {
     private int prop1;
     private int prop2;
     ...
     // Getters and setters for properties.
     ...

     // Default constructor
     public YourClass() {
     }

     // Copy constructor
     public YourClass(YourClass instance) {
         this.prop1 = instance.getProp1();
         this.prop2 = instance.getProp2();
         // The same for other methods
     }

}

这是StackOverflow上的good post about clonning vs copy costructors vs factory methods

答案 2 :(得分:1)

在课程abc中使用深度克隆。实施Cloneable界面并实施clone()

 abc obj = new abc(10,20); // setting the values of two var. say x and y

 abc obj1 = obj.clone();

Cloning取决于你的类结构。如果你考虑下面的简单类,就像你的例子一样。

 class ABC implements Cloneable {

private int a;
private int b;

public int getA() {
    return a;
}

public ABC(int a, int b) {
    super();
    this.a = a;
    this.b = b;
}

public void setA(int a) {
    this.a = a;
}

public int getB() {
    return b;
}

public void setB(int b) {
    this.b = b;
}

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

在main中测试它将返回 false

public static void main(String[] args) throws CloneNotSupportedException {

    ABC a = new ABC(1, 2);

    ABC b = (ABC) a.clone();

    System.out.println(a == b);
}

答案 3 :(得分:1)

你必须构建一个新对象。 正如其他人指出的那样,您可以通过实现Cloneableclone()来实现这一点,但您可能也可以通过实现构造函数或工厂方法来显式地创建新对象。由原作。

实现不会有太大差别,但我发现显式实例化不易出错。

Josh Bloch在Effective Java中详细评论了这一点。根据您的版本,它是{3}}或第3章中的第11项。

答案 4 :(得分:1)

尝试使用'运算符重载'。 我知道,我知道,Java没有它,但这并不能阻止你“使用”它。

您需要做的就是:

obj1.copy(obj2);

在abc的声明中

public void copy(abc other) {
    var1 = other.var1;
    var2 = other.var2;
}

我想强调一点,这只是来自记忆和未经测试,但我认为没有理由不这样做。

或者,你可以使用'clone()',但要注意你的类中的'references'会被克隆过来。最好还是手动完成。

通过覆盖'copy',您还可以确保正确复制子类。

答案 5 :(得分:1)

使用Object类的clone方法。

MyClass mobj = new MyClass("Vivek");

MyClass mobj1 = mobj.clone();

但是对于深度克隆,请尝试使用Serialization and Deserialization

答案 6 :(得分:1)

你必须使用克隆方法。 clone的默认行为是浅拷贝。