如何在java中初始化对象(例如A),并将其初始成员值设置为第二个对象(例如B)。初始化后,我想修改A的成员而不修改B的成员,所以在A的初始化时,我只想复制B的数据。
发布于 2012-06-28 16:16:24
您可以实现和使用克隆。
MyClass b = new MyClass();
MyClass a = b.clone();注意:有些类是不可克隆的,或者实现失败了。只有在应该是深拷贝时才有浅表拷贝。
如果类是Serializable,则可以序列化它并在内存中反序列化它。不完全是nice,但它能工作。
或者您可以创建自己的“复制”构造函数。
发布于 2012-06-28 16:19:54
克隆是一个简单的复制选项。如果您想在需要更多控制的地方做一些事情,那么创建您自己的方法,按照您需要的方式执行副本:
public MyType copy()
{
MyType a = new MyType();
// Initialize how you need to here, use the object this was called from if you'd like
a.property = this.property;
// etc.
return a;
}这给您更多的直接控制,但需要更多的时间来编写代码。如果克隆人符合你的目的,那就坚持下去。
编辑:我将根据你对这个答案的评论给出一个例子。
让我们假设我们有以下类型:
TypeA: has the following member variables
int number = 5; // Default value built in by constructor.
int letter = 'x'; // Value is 'a' when constructed but has been changed.
ArrayList<TypeB> list = {b1, b2, b3} // All are initialized.
TypeB: has the following member variables
double decimal = 5.32
TypeC someObject = ...
TypeC: has some stuff, but we are going to ignore it.现在,当我们想要复制TypeA时,我们必须执行以下操作:
幸运的是,这些步骤很简单。
int copyNumber = this.number;
char copyChar = this.letter;
ArrayList<TypeB> copyList = this.list;
return new TypeA(copyNumber, copyChar, copyList);现在假设有一个特定的构造函数,它接受这三个参数,但希望您能够理解。
如果您只想获取值,而不是引用ArrayList中的所有TypeB,就会变得很棘手。您必须遍历ArrayList并创建新的TypeB来复制其所有值(double和TypeC对象作为引用或值.)
简而言之,您想要的是一个更容易执行的副本。简单赋值操作符使用原始类型复制值,用对象复制引用。
发布于 2012-06-28 16:21:28
一个可能的解决方案是在类上实现clone方法并使用以下克隆:
MyClass a = new MyClass();
MyClass b = a;您会注意到,clone()实际上不是一个公共方法,因此您需要公开它。此外,您还需要告诉Java您的对象是可克隆的(这使您的类实现了Cloneable)。以下代码对其进行了稀释:
public class MyClass implements Cloneable {
@Override
protected MyClass clone() throws CloneNotSupportedException {
return (MyClass)super.clone();
}
}https://stackoverflow.com/questions/11248738
复制相似问题