1

假设有两个 abc 类的对象

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

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

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

4

7 回答 7

3

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

abc obj1 = obj.clone()

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

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

深拷贝对每个对象的字段进行不同的拷贝,递归遍历被复制对象引用的其他对象的整个图

更多信息:

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

于 2012-07-19T10:52:09.603 回答
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 上的克隆、复制构造函数和工厂方法的好帖子。

于 2012-07-19T10:57:57.027 回答
1

使用深度克隆.Implement Cloneable Interface in classabc并实现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);
}
于 2012-07-19T10:51:36.953 回答
1

您必须构造一个新对象。正如其他人指出的那样,您可以通过实现Cloneableand来实现这一点clone(),但是您也可以通过实现一个构造函数或工厂方法来显式地创建新对象,该方法从原始对象持有的数据中创建新对象。

实现不会有太大差异,但我发现显式实例化不太容易实现错误。

Josh Bloch 在 Effective Java 中对此进行了详细评论。根据您的版本,它是第 3 章中的第10项或第 11 项。

于 2012-07-19T10:54:17.273 回答
1

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

您需要做的就是:

obj1.copy(obj2);

在 abc 的声明中

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

我想强调,这只是来自记忆并且未经测试,但我看不出它为什么不工作的理由。

或者,您可以使用“clone()”,但请注意,您的类中的“引用”会被克隆。真的,最好手动完成。

通过覆盖“复制”,您还可以确保您的子类被正确复制。

于 2012-07-19T10:55:55.027 回答
1

使用 Object 类的 clone 方法。

MyClass mobj = new MyClass("Vivek");

MyClass mobj1 = mobj.clone();

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

于 2012-07-19T10:56:49.357 回答
1

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

于 2012-07-19T11:19:36.520 回答