使用Java包装器类声明变量

使用Java包装器类声明变量,java,reference,Java,Reference,在Java中,我们可以使用包装器类来声明变量。 比如说 Integer x=5; 这意味着存在一个指向值5的引用“x” 然后我声明了另一个名为y的引用,它指向相同的值 Integer y=x; //now y should point to the number "5" 然后我改变了y指向的值 y=20; 这不就是x和y都指向20吗? 因为当我打印x时,我仍然会得到以下5个: y=20; 重新绑定y以指向不同的整数对象 它不接触x,因此它的值不会更改。每次您看

在Java中,我们可以使用包装器类来声明变量。 比如说

    Integer x=5;
这意味着存在一个指向值5的引用“x”

然后我声明了另一个名为y的引用,它指向相同的值

    Integer y=x;  //now y should point to the number "5"
然后我改变了y指向的值

     y=20;
这不就是x和y都指向20吗? 因为当我打印x时,我仍然会得到以下5个:

y=20;
重新绑定
y
以指向不同的
整数
对象


它不接触
x
,因此它的值不会更改。

每次您看到表单中的代码时

Integer x = 5;
编译器将其替换为以下内容

Integer x = Integer.valueOf(5);
这与

Integer x = new Integer(5);

因此,实际上,
y=20
只不过是
y=new Integer(20)
,因此y指针被重新定位以指向新创建的整数对象。

在第一行
Integer x=5
x
是对值为5的整数对象的引用。然后
整数y=x为同一对象创建另一个引用,因此
x
y
引用同一对象。最后,
y=20
使引用
y
指向另一个对象,即值为20的
整数

来自Ken Arnold、James Gosling和David Holmes的“Java编程语言,第四版”:

Java编程语言不通过引用传递对象;它按值传递对象引用。由于同一引用的两个副本引用同一个实际对象,因此通过一个引用变量所做的更改通过另一个可见


但在您的情况下,实际上并不修改初始对象,而是更改其一个引用以指向另一个对象。

Integer x=5

上述语句分配一个内存空间,该内存空间保存值5,并由x引用

整数y=x

上面的语句将引用y指向与x相同的内存位置


将值指定给y=20时。这将创建一个新的内存空间,其中包含值20,并由y引用。因此,此时x和y都指向不同的内存位置。

忘记指针吧——Java中没有这样的东西
y=20
y=Integer相同。valueOf(20)
,因此
y
之后引用不同的对象。所以java总是重新绑定到不同的对象?还有其他办法吗?@fadytaher:对可变类的同一实例有很多引用。