Java-код, почему println 10?

public class Exa {
    public static void main(String[] args) {
        Integer b = new Integer(10);
        add(b);
        System.out.println(b.intValue());
   }

    public static void add(Integer b){
        int i = b.intValue();
        i += 3;
        b = new Integer(i);
        System.out.println("b = "+b+",i = "+i);
    }
}

Я написал приведенный выше код и запустил вывод 10. Почему он не изменился?

Почему вывод 10, дайте, пожалуйста, подробную инструкцию , спасибо!

Вы сделали новый Integer. Вы действительно ожидали, что старый изменится, когда вы это сделали?

Dawood ibn Kareem 22.05.2018 08:47

Вы уверены, что на выходе получится не b = 13, i = 13, а затем 10?

Lars Gendner 22.05.2018 08:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Локальная переменная метода b в вашем основном методе отличается от локальной переменной метода в вашем методе add(). Изменение одного не повлияет на другое.

b = new Integer(i);

Здесь вы имеете в виду переменную в методе add(Integer b), а не переменную в основном методе.

Java is always pass-by-value. Unfortunately, they decided to call the location of an object a "reference". When we pass the value of an object, we are passing the reference to it. This is confusing to beginners.

(Extracted from this answer by erlando)

Значение не меняется, поскольку вы назначаете b только локально внутри метода add. В Java вы не можете изменить значение Integer, вы меняете только ссылку. Чтобы получить предполагаемый побочный эффект, вы можете заключить b в объект.

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