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

时间:2012-06-28 16:14:12

标签: java object pointers initialization

  

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

如何在java中初始化对象(比如说A)并将其初始成员值设置为等于第二个对象(比如说B)。在初始化之后我想修改A的成员而不修改B的成员。所以在A的初始化时我只想复制B的数据。这怎么做得很好?

4 个答案:

答案 0 :(得分:1)

您可以实施和使用克隆

MyClass b = new MyClass();
MyClass a = b.clone();

注意:某些类不是Cloneable,或者已经破坏了实现。例如当它们应该是深拷贝时才有浅拷贝。

如果类是Serializable,您可以将其序列化并在内存中反序列化。不完全是nice,但它确实有效。

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

答案 1 :(得分:0)

克隆是一种简单的复制选项。如果您想要在需要更多控制权的地方做某些事情,请创建自己的方法,以完全按照您的需要执行复制:

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时,我们必须执行以下操作:

  1. 直接复制数字和字符,因为它们是值类型。
  2. 复制对ArrayList的引用,该ArrayList包含对某些TypeB的引用。
  3. 幸运的是,这些都很简单。

    int copyNumber = this.number;
    char copyChar = this.letter;
    ArrayList<TypeB> copyList = this.list;
    return new TypeA(copyNumber, copyChar, copyList);
    

    现在假定一个特定的构造函数接受这三个参数,但希望你能得到这个想法。

    如果你想获取值,而不是对ArrayList中所有TypeB的引用,那将会变得棘手。您必须循环遍历ArrayList并创建复制所有ITS值的新TypeB(double和TypeC对象作为引用或值...)

    简而言之,您想要的是更容易执行的复制。简单赋值运算符使用基本类型和带有对象的引用复制值。

答案 2 :(得分:0)

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

MyClass a = new MyClass();
MyClass b = a;

您会注意到clone()并非真正的公共方法,因此您需要公开它。此外,您需要告诉Java您的对象是Cloneable(这样就完成了您的类实现Cloneable)。以下代码说明了它:

public class MyClass implements Cloneable {

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

}

答案 3 :(得分:0)

这一切都取决于成员的类型。我举一个例子:

class A
{
    public float value;
    public int[] anArray;

    public A(B b)
    {
        //primitive may be assigned directly.
        this.value = b.value;

        // other types different approaches:

        //copy the contents of the array
        this.anArray = new int[b.anArray.length];
        System.arraycopy(b.anArray, 0, this.anArray, 0, b.anArray.length);
    }
}

class B
{
    float value;
    int[] anArray;
    public B(int size)
    {
        this.value = 3f;
        this.anArray = new int[size];
        for (int i = size - 1; i >= 0; i--)
        {
            this.anArray[i] = i * 10;
        }
    }
}

B b = new B(5);
A a = new A(b);