Java对象如何工作?

时间:2013-05-31 00:51:50

标签: java object

为什么这样做的方式......(对我而言,直观)

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”是相同的。

逻辑上(如果我的逻辑有意义),我会假设将一个对象设置为等于另一个对象将是一次性的事情,并且任何一个对象中的任何更改都不会自动更改另一个对象。有没有我遗漏的东西,比如可能只有一个对象有两个引用?还是什么......?

4 个答案:

答案 0 :(得分:3)

  

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

此代码:

obj2 = obj1;

引用分配。没有对象被复制。

答案 1 :(得分:2)

执行分配后,obj1obj2都是引用到同一个对象。所以

之后

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