Почему объект не обновляется

Я написал этот код, и я хотел знать, почему значение объекта, на который ссылаются, не изменяется.

Все вызовы в 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 неизменяем, доступен локально и не указывает на аргумент/передаваемый объект - н.

Он выводит 24, потому что вы меняете ссылку локально. Изменяется локальная переменная, но не оригинал, переданный методом main.

markspace 27.03.2019 05:49

Кроме того, Integer неизменяем, поэтому, конечно, он не обновляется.

markspace 27.03.2019 05:49

Java передается по значению, поэтому вывод -24,3

DHARMENDRA SINGH 27.03.2019 05:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы передаете 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, создается новый объект. Доступно локально.

Nemaly Praveen 27.03.2019 06:15

@NemalyPraveen да, поскольку Integer неизменяем, любая модификация, внесенная в экземпляр, приведет к созданию нового экземпляра.

Fullstack Guy 27.03.2019 06:23

Другие вопросы по теме