Java对象是如何工作的?

Java对象是如何工作的?,java,object,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 t

为什么它会这样工作。。。对我来说,这与直觉相反

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相同

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

执行赋值后,obj1和obj2都是对同一对象的引用。那以后呢

obj2=obj1

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

obj2=新的TestObjectobj1.getInt

或者创建一个新的构造函数,该构造函数接受一个实例并创建一个稍微好一点的API副本。

完成赋值后,obj1和obj2都是对同一对象的引用。那以后呢

obj2=obj1

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

obj2=新的TestObjectobj1.getInt

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

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

此代码:

obj2 = obj1;
是一项参考作业。不会复制任何对象

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

此代码:

obj2 = obj1;

是一项参考作业。未复制任何对象。

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

obj2 = obj1;

无论您使用其中一个引用做了什么更改,更改都将对同一个内存对象进行。

两个对象都指向与您完成赋值相同的内存对象:

obj2 = obj1;

无论您使用其中一个引用做了什么更改,都会对同一个内存对象进行更改。

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

...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...

键入obj2=obj1时;您基本上说过obj2和obj1的指针都应该指向相同的内存地址,因此指向相同的对象。 您应键入:

...
obj1 = new TestObject();
obj1.setInt(1);
obj2 = new TestObject();
...

没有对象被复制。。那就有道理了。我该如何使对象被复制?我必须手动创建第二个对象吗?不会复制任何对象。。那就有道理了。我该如何使对象被复制?我必须手动创建第二个对象吗?