为什么分配的 java 变量表现得像一个引用?

why is assigned java variable behaving like a reference?

嗨,我不知道以前是否有人问过这个问题,但这真的很烦人...

好的,所以我有一个 class 叫做测试:

public class Test {
    public static Test testObject = new Test(5);//Creates a test object with an initialized value of 5;
    int number;
    public Test(int number){
        this.number = number;
    }
}

当然还有我的主要 class...

public class Main {
    public static void main(String args[]){
        Test anotherObject = Test.testObject;//this is not a reference right?
        System.out.println(Test.testObject.number);//This prints 5
        anotherObject.number = 50;// changing anotherObject's number. NOT testObject's Number.
        System.out.println(Test.testObject.number);//if that was true this whould of still been 5, but it prints 50!!?? why does testObject's number even change if im not even changing that value?
    }
}

如果我做错了什么,请告诉我,非常感谢!

在您的程序中,您有一个 Test 的单个实例,只是每次都以不同的方式命名。

Test anotherNumber = Test.testObject;

是否创建新对象。它只引用同一个对象,你说 "Whenever I write anotherNumber, I actually meant to write Test.testObject".

因此,当您稍后更改 anotherNumber.number = 50; 时,您会执行:Test.testObject.number = 50;,因此当您打印 Test.testObject 时,您会看到 50。


编辑:

如果你希望能够创建某个对象的副本,你可以引入一个复制构造函数:

public Test(Test original) { 
   this.number = original.number;
}

并与someOtherNumber = new Test(Test.testObject);

一起使用

在您的 class 测试中,您正在创建一个始终为 5 的新测试对象。因此,取出您在测试 class 中创建的测试对象,然后使用以下命令主要方法中的代码:

Test anotherNumber = new Test(5);
System.out.println(anotherNumber.number);
anotherNumber.number = 50;
System.out.println(anotherNumber.number);