Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中为对象分配相同的值_Java_Object_Clone - Fatal编程技术网

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

在java中为对象分配相同的值,java,object,clone,Java,Object,Clone,让我们假设abc类有两个对象 abc obj=新abc10,20;//设置两个变量的值,例如x和y abc obj1=obj;//指向相同的内存,所以值相同 但是如果有一种方法,我可以将一个对象的值分配给另一个对象,两者都有不同的内存。简单地说,我希望复制值,而不是地址。任何操作员或其他人都可以这样做?使用深度克隆。在类abc中实现接口并实现克隆 克隆取决于你的类结构。如果你考虑下面的简单类,比如你的例子。 class ABC implements Cloneable { private i

让我们假设abc类有两个对象

abc obj=新abc10,20;//设置两个变量的值,例如x和y

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

但是如果有一种方法,我可以将一个对象的值分配给另一个对象,两者都有不同的内存。简单地说,我希望复制值,而不是地址。任何操作员或其他人都可以这样做?

使用深度克隆。在类abc中实现接口并实现克隆

克隆取决于你的类结构。如果你考虑下面的简单类,比如你的例子。

 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

使用深度克隆。在类abc中实现接口并实现克隆

克隆取决于你的类结构。如果你考虑下面的简单类,比如你的例子。

 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

假设子类实现java.lang.Cloneable接口,则可以使用clone方法

abc obj1 = obj.clone()
请记住,克隆的默认行为是返回对象的浅拷贝。这意味着所有原始对象字段的值都复制到新对象的字段中,而不会穿过其他对象的整个图形

如果您想深度复制对象,您可以对其进行序列化和反序列化

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

更多信息,请访问:

假设子类实现java.lang.Cloneable接口,则可以使用clone方法

abc obj1 = obj.clone()
请记住,克隆的默认行为是返回对象的浅拷贝。这意味着所有原始对象字段的值都复制到新对象的字段中,而不会穿过其他对象的整个图形

如果您想深度复制对象,您可以对其进行序列化和反序列化

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

更多信息,请访问:


你必须构造一个新对象。 正如其他人指出的,您可以通过实现Cloneable和clone来实现这一点,但是您也可以通过实现构造函数或工厂方法来显式地创建新对象,该方法使用原始对象所持有的数据创建新对象

实现不会有太大区别,但我发现显式实例化不太容易实现错误


Josh Bloch用有效的Java详细地评论了这一点。根据您的版本,它是或第3章中的第11项。

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

实现不会有太大区别,但我发现显式实例化不太容易实现错误


Josh Bloch用有效的Java详细地评论了这一点。根据您的版本,它是或第3章中的第11项。

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

您需要做的只是:

obj1.copy(obj2);
在abc的声明中

public void copy(abc other) {
    var1 = other.var1;
    var2 = other.var2;
}
我想强调的是,这仅仅是出于记忆和未经测试,但我看不出有什么理由不起作用

或者,您可以使用“clone”,但请注意,类中的“引用”将被克隆。最好是手动操作,真的


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

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

您需要做的只是:

obj1.copy(obj2);
在abc的声明中

public void copy(abc other) {
    var1 = other.var1;
    var2 = other.var2;
}
我想强调的是,这仅仅是出于记忆和未经测试,但我看不出有什么理由不起作用

或者,您可以使用“clone”,但请注意,类中的“引用”将被克隆。最好是手动操作,真的


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

使用对象类的克隆方法

MyClass mobj = new MyClass("Vivek");

MyClass mobj1 = mobj.clone();

但对于深度克隆,请尝试使用序列化和反序列化

使用对象类的克隆方法

MyClass mobj = new MyClass("Vivek");

MyClass mobj1 = mobj.clone();

但对于深度克隆,尝试使用序列化和反序列化

如果使用克隆方法,则必须实现可克隆接口,并为该方法编写自己的实现。我认为最好在类中创建一个复制构造函数并使用它

例如:

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的。

如果使用clone方法,您必须实现Cloneable接口,并为该方法编写自己的实现。我认为最好在clas中创建一个副本构造函数 使用它

例如:

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的。

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

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

在使用克隆之前,请阅读解释。在使用克隆之前,请阅读解释。克隆的实现会自动为该对象分配新的内存空间,而不需要使用新关键字?克隆将在内存中为您创建新对象,并返回对该对象的引用,克隆可能会有令人困惑和奇怪的行为,通常最好自己实现一个复制工厂或构造函数。参见例如,有效Java第11项,因为已经有了关于这一效果的答案,所以我在其中添加了对有效Java的引用。谢谢,Louis.clone的实现会自动为这个对象分配新的内存空间,而不需要新的关键字?clone会在内存中为您创建新的对象,并返回对它的引用,也就是说,clone可能会有令人困惑和奇怪的行为,通常最好是自己实现一个复制工厂或构造函数。参见例如,有效Java第11项,因为已经有了关于这一效果的答案,所以我在其中添加了对有效Java的引用。谢谢,路易斯。