有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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。爪哇

public class TestObject {

    int integer;

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

    public int getInt() {
        return integer;
    }

}

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

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


共 (4) 个答案

  1. # 1 楼答案

    这两个对象都指向同一个内存对象,因为您已经完成了分配:

    obj2 = obj1;
    

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

  2. # 2 楼答案

    执行赋值后,obj1obj2都是对同一对象的引用。那之后呢

    obj2 = obj1;

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

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

    或者创建一个新的构造函数来获取一个实例并创建一个副本(一个更好的API)

  3. # 3 楼答案

    maybe there is really only one object with two references?

    此代码:

    obj2 = obj1;
    

    是一个参考赋值。不会复制任何对象

  4. # 4 楼答案

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

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