为什么这样做的方式......(对我而言,直观)
Test.java:
public class Test {
public TestObject obj1;
public TestObject obj2;
public Test() {
obj1 = new TestObject();
obj1.setInt(1);
obj2 = obj1;
System.out.println("Should be the same: " + obj1.getInt() + ", " + obj2.getInt());
obj1.setInt(2);
System.out.println("Should be different? (2, 1): " + obj1.getInt() + ", " + obj2.getInt());
obj2.setInt(3);
System.out.println("Should be different? (2, 3): " + obj1.getInt() + ", " + obj2.getInt());
}
public static void main(String[] args) {
new Test();
}
}
TestObject.java
public class TestObject {
int integer;
public void setInt(int n) {
integer = n;
}
public int getInt() {
return integer;
}
}
这令人惊讶地导致“两个对象”发生变化,因此“int integer”是相同的。
逻辑上(如果我的逻辑有意义),我会假设将一个对象设置为等于另一个对象将是一次性的事情,并且任何一个对象中的任何更改都不会自动更改另一个对象。有没有我遗漏的东西,比如可能只有一个对象有两个引用?还是什么......?
答案 0 :(得分:3)
也许只有一个对象有两个引用?
是
此代码:
obj2 = obj1;
是引用分配。没有对象被复制。
答案 1 :(得分:2)
执行分配后,obj1
和obj2
都是引用到同一个对象。所以
obj2 = obj1;
两个引用都指向同一个对象;所有结果都应该匹配。如果要复制,可以执行类似
的操作 obj2 = new TestObject(obj1.getInt());
或者创建一个新的构造函数,它接受一个实例并创建一个副本(一个更好的API)。
答案 2 :(得分:0)
两个对象都指向与完成赋值相同的内存对象:
obj2 = obj1;
无论您使用其中任何一个引用做什么更改,都会对同一个内存对象进行更改。
答案 3 :(得分:0)
键入obj2 = obj1时;你基本上说obj2和obj1的两个指针应指向相同的内存地址,因此,指向同一个对象。 你应该输入:
...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...