Java 复制对象字段

Java 复制对象字段,java,Java,当我需要两个独立变量时,复制类的最佳方式是什么? 我有一节简单的课: public class MyClass { boolean a = false; String b= "not empty"; } 我是否需要制定一些方法,如: assign(MyClass data ) { a= data.a; b= data.b; } java中是否有自动复制(复制)对象的方法 我是否需要制定一些方法,如: assign(MyClass data ) { a= data.a; b= data.b;

当我需要两个独立变量时,复制类的最佳方式是什么? 我有一节简单的课:

public class MyClass 
{
boolean a = false;
String b= "not empty";
}
我是否需要制定一些方法,如:

assign(MyClass data )
{
a= data.a;
b= data.b;
}
java中是否有自动复制(复制)对象的方法

我是否需要制定一些方法,如:

assign(MyClass data )
{
a= data.a;
b= data.b;
}
非常接近。您应该将其设置为构造函数,而不是将其设置为方法。这样的构造函数被调用,您可以这样创建它们:

MyClass(MyClass data) {  
    a = data.a;
    b = data.b;
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);
然后要创建实例的副本,请使用如下构造函数:

MyClass(MyClass data) {  
    a = data.a;
    b = data.b;
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);

复制构造函数可能会很乏味

当您的类具有可变字段时,使用复制构造函数创建深度复制可能会很乏味。在这种情况下,像这样的赋值只会创建引用的副本,而不是对象本身。还必须创建这些字段的副本(如果需要深度副本)。这可以是递归的

创建深度复制的更好方法是序列化然后反序列化对象

为什么不使用clone()?

在对象类中添加
clone()
方法是一个很大的错误,我认为。您应该避免使用它来克隆对象

  • 首先,要使用该方法,您必须实现
    Cloneable
    接口,而该接口实际上没有
    clone()
    方法。实际上,它只是一个标记接口
  • 方法的返回类型为
    对象
    。因此,这意味着您实际上可以返回一个完全不相关的类的实例,从而在运行时将代码引导到一个潜在的
    ClassCastException

另请参见:

我是否需要制定一些方法,如:

assign(MyClass data )
{
a= data.a;
b= data.b;
}
非常接近。您应该将其设置为构造函数,而不是将其设置为方法。这样的构造函数被调用,您可以这样创建它们:

MyClass(MyClass data) {  
    a = data.a;
    b = data.b;
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);
然后要创建实例的副本,请使用如下构造函数:

MyClass(MyClass data) {  
    a = data.a;
    b = data.b;
}
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass(obj1);

复制构造函数可能会很乏味

当您的类具有可变字段时,使用复制构造函数创建深度复制可能会很乏味。在这种情况下,像这样的赋值只会创建引用的副本,而不是对象本身。还必须创建这些字段的副本(如果需要深度副本)。这可以是递归的

创建深度复制的更好方法是序列化然后反序列化对象

为什么不使用clone()?

在对象类中添加
clone()
方法是一个很大的错误,我认为。您应该避免使用它来克隆对象

  • 首先,要使用该方法,您必须实现
    Cloneable
    接口,而该接口实际上没有
    clone()
    方法。实际上,它只是一个标记接口
  • 方法的返回类型为
    对象
    。因此,这意味着您实际上可以返回一个完全不相关的类的实例,从而在运行时将代码引导到一个潜在的
    ClassCastException

另请参见:


您可以使用复制构造函数手动执行深度克隆,也可以使用可用于此目的的实用程序,例如:


如果您的类有许多非原始成员变量,那么深度克隆的复杂性会增加,我建议您使用该实用程序。

您可以使用复制构造函数手动执行深度克隆,或者您可以使用可用于此目的的实用程序,例如:


如果我们的类有许多非原始成员变量,那么深度克隆的复杂性就会增加,我建议您使用该实用程序。

这是两种方法,首先使用可克隆接口(这不是首选),另一种是在类内创建一个方法,返回当前状态的新实例

public class MyObject implements Cloneable {

    private int num = 0;

    // a method to show how to clone an object
    private void copyObject() throws CloneNotSupportedException {

        MyObject a = new MyObject();
        a.num = 10;

        MyObject b = (MyObject)a.clone();
        System.out.println(b.num);
        // result : 10
        // values are copied to the new object

        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        // result : 10 - 20
        // 2 different objects, the new object didnt effect the original one
    }

    // a method to create a copy
    public MyObject copy() {
        MyObject copy = new MyObject();
        copy.num = this.num;
        // do the same to all your variables
        return copy;
    }

    // a method to show how to use the copy() method
    private void useCopy(){

        MyObject a = new MyObject();
        a.num = 100;

        MyObject b = a.copy();

        System.out.println(a.num+" - "+b.num); 
        //  result : 100 - 100
        //  value copied to the new Object

        a.num = 10;
        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        //  result : 10 - 20
        //  although b was copied from a, but both are 2 different Objects
    }
}
还有另外一种使用反射包复制值的方法,但毕竟,您确定在设计方面走的是正确的道路吗


如果你能告诉我们你在想什么,也许设计模式会有所帮助。这有两种方法,第一种是使用可克隆接口(这不是首选),另一种是在你的类中创建一个方法,返回一个当前状态的新实例

public class MyObject implements Cloneable {

    private int num = 0;

    // a method to show how to clone an object
    private void copyObject() throws CloneNotSupportedException {

        MyObject a = new MyObject();
        a.num = 10;

        MyObject b = (MyObject)a.clone();
        System.out.println(b.num);
        // result : 10
        // values are copied to the new object

        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        // result : 10 - 20
        // 2 different objects, the new object didnt effect the original one
    }

    // a method to create a copy
    public MyObject copy() {
        MyObject copy = new MyObject();
        copy.num = this.num;
        // do the same to all your variables
        return copy;
    }

    // a method to show how to use the copy() method
    private void useCopy(){

        MyObject a = new MyObject();
        a.num = 100;

        MyObject b = a.copy();

        System.out.println(a.num+" - "+b.num); 
        //  result : 100 - 100
        //  value copied to the new Object

        a.num = 10;
        b.num = 20;
        System.out.println(a.num + " - " + b.num);
        //  result : 10 - 20
        //  although b was copied from a, but both are 2 different Objects
    }
}
还有另外一种使用反射包复制值的方法,但毕竟,您确定在设计方面走的是正确的道路吗


如果你能告诉我们你在想什么,也许设计模式会有帮助,一个复制构造函数或方法可能会派上用场。你需要的是一个深度复制。我想你可以通过一个复制构造函数来做到这一点。一个复制构造函数或方法可能会派上用场。你需要的是一个深度副本。我想你可以通过复制构造函数来实现。哇,这真是太棒了。。用java编程已经有一段时间了,但从未见过@KubaSpatny它是所有
java.util
集合类的标准。@arshajii one从未停止学习:)感谢您指出这一点,我将不得不更深入地研究它。我一直在使用深度复制的方法。哇,这真是太棒了。。用java编程已经有一段时间了,但从未见过@KubaSpatny它是所有
java.util
集合类的标准。@arshajii one从未停止学习:)感谢您指出这一点,我将不得不更深入地研究它。我一直在使用深度复制的方法。