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