1

为什么它会以它的方式工作......(对我来说违反直觉)

测试.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();
    }

}

测试对象.java

public class TestObject {

    int integer;

    public void setInt(int n) {
        integer = n;
    }

    public int getInt() {
        return integer;
    }

}

这令人惊讶地导致“两个对象”发生变化,因此“int integer”是相同的。

从逻辑上讲(如果我的逻辑有意义的话),我会假设将一个对象设置为等于另一个对象将是一次性的事情,并且任何一个对象的任何更改都不会自动更改另一个对象。有没有我遗漏的东西,比如也许真的只有一个对象有两个引用?或者其他的东西... ?

4

4 回答 4

3

也许真的只有一个对象有两个引用?

是的。

这段代码:

obj2 = obj1;

参考作业。没有对象被复制。

于 2013-05-31T00:53:15.810 回答
2

在您完成分配后,两者obj1obj2都是对同一对象的引用。所以之后

obj2 = obj1;

两个引用都指向同一个对象;所有结果都应该匹配。如果你想复制,你可以做类似的事情

obj2 = new TestObject(obj1.getInt());

或者创建一个新的构造函数,它接受一个实例并创建一个副本(更好的 API)。

于 2013-05-31T00:53:11.960 回答
0

这两个对象都指向与您完成分配相同的内存对象:

obj2 = obj1;

无论您使用任何一个引用进行什么更改,都会对同一个内存对象进行更改。

于 2013-05-31T00:54:54.357 回答
0

当您输入 obj2 = obj1; 你基本上说 obj2 和 obj1 的指针都应该指向同一个内存地址,因此,指向同一个对象。你应该输入:

...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...
于 2013-05-31T00:55:11.923 回答