【问题标题】:assigning same values to objects in java为java中的对象分配相同的值
【发布时间】:2012-07-18 12:57:42
【问题描述】:

假设有两个 abc 类的对象

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

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

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

【问题讨论】:

标签: java object clone


【解决方案1】:

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

abc obj1 = obj.clone()

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

我想“深拷贝”可以序列化和反序列化的对象。

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

更多信息:

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

【讨论】:

  • 实现clone会自动给这个对象分配新的内存空间,不需要new关键字?
  • Clone 会在内存中为你创建新对象并返回对它的引用
  • 也就是说,clone 可能有令人困惑和奇怪的行为,通常最好自己实现一个复制工厂或构造函数。 (参见例如有效的 Java 项目 11)
  • 既然已经有了这个效果的答案,我在其中添加了对 Effective Java 的引用。谢谢,路易斯。
【解决方案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

【讨论】:

    【解决方案3】:

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

    您需要做的就是:

    obj1.copy(obj2);
    

    并且在 abc 的声明中

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

    我想强调,这只是凭记忆,未经测试,但我看不出它不应该起作用的原因。

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

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

    【讨论】:

      【解决方案4】:

      使用Object类的clone方法。

      MyClass mobj = new MyClass("Vivek");
      
      MyClass mobj1 = mobj.clone();
      

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

      【讨论】:

        【解决方案5】:

        使用深度克隆。在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);
        }
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            Josh Bloch 在 Effective Java 中对此进行了深入探讨。根据您的版本,它是item 10 或第 3 章中的第 11 项。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-23
              • 2021-05-16
              • 2011-05-20
              • 2023-03-17
              • 1970-01-01
              相关资源
              最近更新 更多