1

我目前正在创建一个 Android 应用程序,并认为我在内部保存数据等方面存在问题。结果发现问题与此无关,而是与我对 Java 的理解有关。

问题是当我这样做时

myObject1 = myObject2;

并使用myObject1in myObject3which 可能是一个列表,或者其他任何东西(在我的情况下是一个 Hashtable),然后 change myObject2myObject3也会相应地改变。这叫什么,我在哪里可以了解更多信息?我如何分配myObject2myObject1使其myObject1完全“独立”?

4

6 回答 6

5

在 Java 中作为对象的变量称为引用,并引用内存中的相同位置。如果您想要两个相同类型的对象不引用内存中的相同位置,则需要使用关键字在您的机器上为它们分配内存。new

下面两个变量 myObject1 和 myObject2 是对 OBJECT1 对象的引用,但它们不存在于同一内存位置:

OBJECT1 myObject1 = new OBJECT1();
OBJECT1 myObject2 = new OBJECT1();

如果将一个对象分配给另一个对象很重要,您可以查看clone()方法或使用复制构造函数:

public OBJECT1(OBJECT1 toCopy)
{
    this.field1 = toCopy.field1; 
    this.field2 = toCopy.field2; 
    this.field3 = toCopy.field3; 
    this.field4 = toCopy.field4;     
}
于 2012-08-01T12:43:56.677 回答
4

这些变量是对对象的引用;将每个变量视为字符串的结尾。另一端与物体相连。如果您分配一个变量,您就是将一个新字符串绑定到一个对象上。

要创建副本,您(不出所料)需要创建副本。有时,这很容易:可能有一个复制构造函数可以让你这样做:

ArrayList<String> copy = new ArrayList<String>(oldArrayList);

其他时候,你可能是一种复制的方法;例如,一些类实现了该clone()方法:

Foo copy = (Foo) otherFoo.clone();

你只需要研究一个类的 API 就可以找到复制对象的方法。

于 2012-08-01T12:43:01.097 回答
1

这取决于是什么myObject。您正在寻找的词是clone如果您想要一个精确的副本。但并非所有对象都支持克隆,因此您可能必须构建自己的克隆方法(如@Hunter 指出的那样)需要通过 new 关键字分配新内存。

于 2012-08-01T12:43:25.707 回答
0

所以在 Java 或任何 OOP 语言中

如果您考虑该声明

Object obj = new Object()

obj 被称为句柄,它实际上指向存储实际对象的位置。

所以当你这样做时,obj1 = obj你会得到 2 个实际上指向同一个位置的句柄

因此,如果您这样做obj1.setSomething(),它也会反映在obj.getSomething()通话中。

于 2012-08-01T12:46:02.963 回答
0

变量包含对对象的引用。在其他语言中,引用通常称为指针。这样做myObject1 = myObject2;会使myObject1变量引用与变量相同的对象myObject2

如果要复制一个对象,最好的方法是自己实现它,例如使用复制构造函数:

public MyClass(MyClass other) {
    this.foo = other.foo;
    this.bar = other.bar;
    ...
}

并因此做

myObject1 = new MyClass(myObject2);
于 2012-08-01T12:46:08.187 回答
0

当您将对象 o1 分配给另一个对象 o2 时,您使 o2 指向 o1。因此,每当您更改对象 o1 对象 o2 时都会相应更改。

列表中的对象也会发生同样的情况。这是因为在 Java 中,当您将一个对象分配给另一个对象时,您不会复制内容,但就像您“共享”它一样。

创建独立于所有内容的另一个对象的唯一方法是使用new然后复制每个属性。

于 2012-08-01T12:52:12.933 回答