Java对象混乱

时间:2012-08-01 12:41:27

标签: java android object pointers

我目前正在创建一个Android应用,并认为我遇到了saving data internally等问题。事实证明问题与此无关,而是我对Java的理解。

问题在于我做的时候

myObject1 = myObject2;

并在myObject1中使用可能是列表的myObject3或其他任何内容(在我的情况下为Hashtable),然后更改myObject2myObject3会相应更改,如好。这叫什么,我在哪里可以了解更多信息?如何将myObject2分配给myObject1,以便myObject1完全“独立”?

6 个答案:

答案 0 :(得分: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;     
}

答案 1 :(得分:4)

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

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

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

其他时候,你可能是一个制作副本的方法;例如,某些类实现了clone()方法:

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

您只需要研究类的API以找到复制对象的方法。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

所以用Java或任何OOP语言

如果您考虑声明

Object obj = new Object()

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

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

所以,如果你obj1.setSomething(),它也会反映在obj.getSomething()电话上。

答案 4 :(得分:0)

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

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

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

然后做

myObject1 = new MyClass(myObject2);

答案 5 :(得分:0)

将对象o1指定给另一个对象o2时,o2指向o1。因此,无论何时更改对象o1,对象o2都会相应地更改。

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

创建与所有内容无关的另一个对象的唯一方法是使用 new ,然后复制每个属性。