繁体   English   中英

Java对象混乱

[英]Java objects confusion

我目前正在创建一个Android应用程序,并认为我在内部保存数据等存在问题。事实证明,问题与该问题无关,但与我对Java的理解有关。

问题是当我这样做

myObject1 = myObject2;

并使用myObject1myObject3这可能是一个列表,或任何(对我来说一个Hashtable),然后改变myObject2myObject3得到相应的改变,也是如此。 这叫什么,在哪里可以了解更多? 我该如何分配myObject2myObject1使myObject1完全“独立”?

在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;     
}

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

要创建副本,您(毫无疑问)需要创建一个副本。 有时,这很容易:可能有一个复制构造函数可让您执行以下操作:

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

有时,您可能是制作副本的方法。 例如,某些类实现了clone()方法:

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

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

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

所以用Java或任何OOP语言

如果您考虑该声明

Object obj = new Object()

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

因此,当您执行obj1 = obj您将获得2个实际上指向相同位置的句柄

因此,如果执行obj1.setSomething()它也会反映在obj.getSomething()调用中。

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

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

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

因此做

myObject1 = new MyClass(myObject2);

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

列表中的对象也是如此。 这是因为在Java中,当您将一个对象关联到另一个对象时,您不会复制内容,而是像“共享”它一样。

从一切创建另一个独立的对象的唯一方法是使用new ,然后复制每个属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM