首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中初始化对象A,等于另一个对象B

在java中初始化对象A,等于另一个对象B
EN

Stack Overflow用户
提问于 2012-06-28 16:14:12
回答 4查看 9.1K关注 0票数 2

可能重复: How do I copy an object in Java?

如何在java中初始化对象(例如A),并将其初始成员值设置为第二个对象(例如B)。初始化后,我想修改A的成员而不修改B的成员,所以在A的初始化时,我只想复制B的数据。

EN

回答 4

Stack Overflow用户

发布于 2012-06-28 16:16:24

您可以实现和使用克隆。

代码语言:javascript
运行
复制
MyClass b = new MyClass();
MyClass a = b.clone();

注意:有些类是不可克隆的,或者实现失败了。只有在应该是深拷贝时才有浅表拷贝。

如果类是Serializable,则可以序列化它并在内存中反序列化它。不完全是nice,但它能工作。

或者您可以创建自己的“复制”构造函数。

票数 1
EN

Stack Overflow用户

发布于 2012-06-28 16:19:54

克隆是一个简单的复制选项。如果您想在需要更多控制的地方做一些事情,那么创建您自己的方法,按照您需要的方式执行副本:

代码语言:javascript
运行
复制
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;
}

这给您更多的直接控制,但需要更多的时间来编写代码。如果克隆人符合你的目的,那就坚持下去。

编辑:我将根据你对这个答案的评论给出一个例子。

让我们假设我们有以下类型:

代码语言:javascript
运行
复制
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时,我们必须执行以下操作:

  1. 直接复制数字和字符,因为它们是值类型。
  2. 复制对ArrayList的引用,其中包含对某些TypeB的引用。

幸运的是,这些步骤很简单。

代码语言:javascript
运行
复制
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对象作为引用或值.)

简而言之,您想要的是一个更容易执行的副本。简单赋值操作符使用原始类型复制值,用对象复制引用。

票数 0
EN

Stack Overflow用户

发布于 2012-06-28 16:21:28

一个可能的解决方案是在类上实现clone方法并使用以下克隆:

代码语言:javascript
运行
复制
MyClass a = new MyClass();
MyClass b = a;

您会注意到,clone()实际上不是一个公共方法,因此您需要公开它。此外,您还需要告诉Java您的对象是可克隆的(这使您的类实现了Cloneable)。以下代码对其进行了稀释:

代码语言:javascript
运行
复制
public class MyClass implements Cloneable {

    @Override
    protected MyClass clone() throws CloneNotSupportedException {
        return (MyClass)super.clone();
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11248738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档