2012-08-01 121 views
1

我目前正在创建一个Android应用程序,并认为我有一个saving data internally等问题。事实证明,问题与此无关,但与我对Java的理解有关。Java对象混淆

的问题是,当我做

myObject1 = myObject2;

myObject3使用myObject1这可能是一个列表,或任何(对我来说一个Hashtable),然后改变myObject2myObject3得到相应的改变,以及。这是什么叫,我在哪里可以了解更多?如何将myObject2指定为myObject1以便myObject1完全“独立”?

回答

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;  
} 
+0

谢谢,现在我明白了! – sk1ll3r 2012-08-01 13:04:10

+0

还有一个问题:如果我的OBJECT1是一个2D数组,那么是什么? – sk1ll3r 2012-08-01 13:08:50

+0

@ sk1ll3r你想执行类似的复制?然后,您必须遍历所有行和列,并将它们复制到新数组中的对应值。这里有一个很好的帖子,有一个例子:http://stackoverflow.com/questions/5617016/how-do-i-copy-a-2-dimensional-array-in-java – 2012-08-01 13:13:46

4

这些变量是引用到一个对象;将每个变量看作字符串的结尾。另一端绑在一个物体上。如果你分配一个变量,你将一个新的字符串绑定到一个对象上。

要创建副本,您(意外)需要创建副本。有时,这很简单:有可能是一个拷贝构造函数,可以让你做到这一点:

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

其他时候,你可能会使得复制的方法;例如,一些类实现clone()方法:

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

你只需要学习一类的API,以找到一种方法来复制对象。

+0

虽然“ArrayList”的拷贝构造函数可能会创建“oldArrayList”的新副本(即列表),但它并不一定会为您提供'oldArrayList'中元素的新副本。执行'copy.get(0).someOperation()'可能会根据复制构造函数的定义如何回写到'oldArrayList'元素0。 – 2012-08-01 12:52:01

+0

事实上,它不会复制元素,只是列表本身,所以您可以在一个副本中添加和删除元素,而不会影响另一个元素中的元素的数量或顺序。 – 2012-08-01 12:55:33

1

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

0
在Java或任何OOP语言

所以

Object obj = new Object() 

OBJ被称为其实际指向哪里实际对象的存储位置的手柄。

所以当你,如果你做obj1.setSomething()obj1 = obj你得到2个把手这实际上是指向同一个位置

因此它将在obj.getSomething()呼叫也有所体现。

0

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

如果你想使一个对象的副本,最好的办法是使用拷贝构造函数来实现它自己,例如:

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

,因此做

myObject1 = new MyClass(myObject2); 
0

当你将一个对象o1分配给另一个对象o2,使o2指向o1。所以无论何时你改变对象o1对象o2都相应地改变。

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

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