不可变整数包装到另一个类中(按值调用)

ste*_*337 6 java integer immutability

我想知道在Java中调用值并尝试一些代码.

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        Integer integer = 4;
        System.out.println(integer);
        test.change(integer);
        System.out.println(integer);
    }

    public void change(Integer integer) {
        integer++;
    }
}
Run Code Online (Sandbox Code Playgroud)

因为java是按值调用,所以我的输出类似于:

4
5
Run Code Online (Sandbox Code Playgroud)

但它打印出来了

4
4
Run Code Online (Sandbox Code Playgroud)

然后我了解到Integers是不可变的,所以我的方法"change"创建了值为5的新Integer,而main中的"integer"仍然是4.

然后我写了下面的课:

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        MyInteger myInteger = new MyInteger();
        myInteger.x = 4;
        System.out.println(myInteger.x);
        test.change(myInteger);
        System.out.println(myInteger.x);
    }
    public void change(MyInteger myInteger) {
        myInteger.x++;
    }
} 
class MyInteger {
    Integer x;
}
Run Code Online (Sandbox Code Playgroud)

而现在输出就像我最初预期的那样

4
5
Run Code Online (Sandbox Code Playgroud)

这是我的论文:

方法通过创建一个新的不可变来change(Integer integer)修改myInteger对象,并且此方法中的参数始终指向同一个实例.我对吗?IntegerInteger xmyIntegerMyInteger

Sha*_*pta 1

你是绝对正确的。myInteger.x++实际上正在改变值,因为Integer x实例变量是共享的。

事实上myInteger.x++还创建了一个新的不可变Integer实例。但是您可以通过test变量访问这个新实例,因此您永远不会忘记它的更改。

作为避免混淆的经验法则,我会说:

当您将参数传递给某个函数时,直接使用它做什么并不重要,重要的是您对其子对象做什么。

在您的情况下:myInteger.x,x是 的子对象myInteger.这就是为什么您可以看到您所做的更改。