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从未停止学习:)感谢您指出这一点,我将不得不更深入地研究它。我一直在使用深度复制的方法。