Java 为什么对象没有被更新

Java 为什么对象没有被更新,java,wrapper,autoboxing,Java,Wrapper,Autoboxing,我已经写了这段代码,我想知道为什么被引用对象的值没有被更改 java中的所有调用都是按值调用的。但是,当调用引用同一个对象时,为什么不更新该对象 班长{ 公共静态无效字符串[]args{ 整数n=3; 三倍体; System.out.printlnHello world!+n; } 公共静态无效三元组x { x*=8; System.out.printlnHello world!+x; } } 实际产量 Hello world! 24 Hello world! 3 但我认为输出应该是 Hell

我已经写了这段代码,我想知道为什么被引用对象的值没有被更改

java中的所有调用都是按值调用的。但是,当调用引用同一个对象时,为什么不更新该对象

班长{ 公共静态无效字符串[]args{ 整数n=3; 三倍体; System.out.printlnHello world!+n; } 公共静态无效三元组x { x*=8; System.out.printlnHello world!+x; } } 实际产量

Hello world! 24
Hello world! 3
但我认为输出应该是

Hello world! 24
Hello world! 24
是否因为Integer类的取消装箱和自动装箱,所以创建了一个与“x”同名的新对象,因为Integer是不可变的,本地可用,并且不指向传递的参数/对象-n.

当您将整数n传递给triple方法时,实际上是在传递Integer对象n的引用值

所以在triple方法中,另一个局部变量x在被调用时指向这个参考值。在方法内部,当它将这个Integer对象的值乘以8时,它将创建另一个Integer的新实例,因为Integer是不可变的,局部变量x将指向该实例

因此,您不会在print语句System.out.printlnHello world中看到此新值!+N因为n仍然指向整数的旧实例,它仍然是3

如果您使用StringBuilder尝试此操作,您将得到预期的结果:

public static void main(String[] args) {
    StringBuilder n = new StringBuilder("foo");
    triple(n);
    System.out.println("Hello world! " + n);
}

public static void triple(StringBuilder s) {
    s.append("bar");
    System.out.println("Hello world! " + s);
}
这里的输出将是:

Hello world! foobar
Hello world! foobar

这是因为StringBuilder是可变的,如果triple通过追加数据来修改数据,则原始指针n和新指针s都将指向对象引用的相同值。

它输出24,因为您在本地更改了引用。局部变量会更改,但主方法传入的原始变量不会更改。此外,Integer是不可变的,因此它当然不会更新。Java是按值传递的,这就是为什么输出-24,3So当我尝试修改x时,会创建一个新对象。本地可访问。@NemalyPraveen是的,因为Integer是不可变的,所以对实例所做的任何修改都将产生一个新实例。