Java对象混淆

Java对象混淆,java,android,object,pointers,Java,Android,Object,Pointers,我目前正在创建一个Android应用程序,并认为我有一个问题,等等。结果表明,问题与此无关,而是与我对Java的理解有关 问题是当我这么做的时候 myObject1=myObject2 然后在myObject3中使用myObject1,它可能是一个列表,或者任何东西(在我的例子中是一个哈希表),然后更改myObject2,myObject3也会相应地更改。这叫什么,我在哪里可以了解更多?如何将myObject2分配给myObject1,使myObject1完全“独立”?这些变量是对对象的引用;将

我目前正在创建一个Android应用程序,并认为我有一个问题,等等。结果表明,问题与此无关,而是与我对Java的理解有关

问题是当我这么做的时候

myObject1=myObject2

然后在
myObject3
中使用
myObject1
,它可能是一个列表,或者任何东西(在我的例子中是一个哈希表),然后更改
myObject2
myObject3
也会相应地更改。这叫什么,我在哪里可以了解更多?如何将
myObject2
分配给
myObject1
,使
myObject1
完全“独立”?

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

要创建副本,您(毫不奇怪)需要创建副本。有时,这很简单:可能有一个复制构造函数可以让您执行以下操作:

ArrayList<String> copy = new ArrayList<String>(oldArrayList);
您只需研究类的API就可以找到复制对象的方法。

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

要创建副本,您(毫不奇怪)需要创建副本。有时,这很简单:可能有一个复制构造函数可以让您执行以下操作:

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

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

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

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

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

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

OBJECT1 myObject1 = new OBJECT1();
OBJECT1 myObject2 = new OBJECT1();
如果将一个对象分配给另一个对象很重要,则可以查看该方法或使用复制构造函数:

public OBJECT1(OBJECT1 toCopy)
{
    this.field1 = toCopy.field1; 
    this.field2 = toCopy.field2; 
    this.field3 = toCopy.field3; 
    this.field4 = toCopy.field4;     
}

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

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

OBJECT1 myObject1 = new OBJECT1();
OBJECT1 myObject2 = new OBJECT1();
如果将一个对象分配给另一个对象很重要,则可以查看该方法或使用复制构造函数:

public OBJECT1(OBJECT1 toCopy)
{
    this.field1 = toCopy.field1; 
    this.field2 = toCopy.field2; 
    this.field3 = toCopy.field3; 
    this.field4 = toCopy.field4;     
}

所以在Java或任何OOP语言中

如果你认为语句

Object obj = new Object()
obj称为句柄,它实际上指向实际对象存储的位置

因此,当您执行
obj1=obj
操作时,将得到两个实际指向同一位置的句柄


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

因此在Java或任何OOP语言中都是如此

如果你认为语句

Object obj = new Object()
obj称为句柄,它实际上指向实际对象存储的位置

因此,当您执行
obj1=obj
操作时,将得到两个实际指向同一位置的句柄

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

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

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

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

myObject1 = new MyClass(myObject2);
变量包含对对象的引用。在其他语言中,引用通常称为指针。这样做
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中,当您将一个对象分配给另一个对象时,您不会复制内容,但它就像您“共享”它一样


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

将对象o1指定给另一个对象o2时,使o2指向o1。所以,每当你改变对象o1,对象o2都会相应地改变

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


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

需要注意的是,虽然
ArrayList
的复制构造函数可能会创建
oldArrayList
的新副本(即列表),但它不会