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
你是绝对正确的。myInteger.x++实际上正在改变值,因为Integer x实例变量是共享的。
事实上myInteger.x++还创建了一个新的不可变Integer实例。但是您可以通过test变量访问这个新实例,因此您永远不会忘记它的更改。
作为避免混淆的经验法则,我会说:
当您将参数传递给某个函数时,直接使用它做什么并不重要,重要的是您对其子对象做什么。
在您的情况下:myInteger.x,x是 的子对象myInteger.这就是为什么您可以看到您所做的更改。