Я написал этот код, и я хотел знать, почему значение объекта, на который ссылаются, не изменяется.
Все вызовы в java вызываются по значению. Но когда вызов относится к одному и тому же объекту, почему объект не обновляется?
class Main {
public static void main(String[] args) {
Integer n = 3;
triple(n);
System.out.println("Hello world! " + n);
}
public static void triple(Integer x)
{
x *= 8;
System.out.println("Hello world! " + x);
}
}
Фактический результат
Hello world! 24
Hello world! 3
Но я думал, что вывод должен быть
Hello world! 24
Hello world! 24
Так ли это из-за распаковки и автоупаковки для класса Integer, что новый объект создается с тем же именем, что и «x», потому что Integer неизменяем, доступен локально и не указывает на аргумент/передаваемый объект - н.
Кроме того, Integer неизменяем, поэтому, конечно, он не обновляется.
Java передается по значению, поэтому вывод -24,3




Когда вы передаете Integer n методу triple, вы фактически передаете значение ссылки на Integer объект n.
Итак, в методе triple другая локальная переменная x указывает на эталонное значение при вызове. Внутри метода, когда он умножает значение этого объекта Integer на 8, он создает еще один экземпляр новыйInteger, поскольку Integer — это неизменный, на который будет указывать локальная переменная x.
Таким образом, вы не увидите это новое значение в операторе печати System.out.println("Hello world! " + n);, так как n все еще указывает на старый экземпляр Integer, который по-прежнему 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 будут указывать на одно и то же значение ссылки на объект.
Поэтому, когда я пытаюсь изменить x, создается новый объект. Доступно локально.
@NemalyPraveen да, поскольку Integer неизменяем, любая модификация, внесенная в экземпляр, приведет к созданию нового экземпляра.
Он выводит
24, потому что вы меняете ссылку локально. Изменяется локальная переменная, но не оригинал, переданный методомmain.