Объясните почему такое поведение у обьекта

Вопрос теоретический. У меня есть объект, предположим Room у котором есть несколько int полей. Если я создам новый объект в методе мэйн, а затем передам его в любой другой метод и там изменю одно из значений, то и в мэйне отразятся данные изменения. Пример:

public static void main(String[] args) {
    Room room = new Room();
    room.setPrice(1);
    test(room);
    System.out.println(room.getPrice());
}

private static void test(Room room){
        room.setPrice(123);
}

Вывод 123, что логично, ведь как я понимаю, в метод передается ссылка на объект и изменяется он в куче, отсюда инфа о нем обновляется везде.

Но совсем по другому будет выглядеть вывод программы, если в методе объект приравнять к null. Как я думал, должно выскочить NPE, но вместо этого, метод будто бы игнорируется. Почему происходит именно это?


Ответы (1 шт):

Автор решения: tym32167

Допустим, ваш изначальный Room (объект) - это дом. Переменная - это, по сути, бумажка с адресом дома. То есть вот тут

Room room = new Room();

вы

  1. Создаете дом, где поселяется и живет объект
  2. создаете бумажку (переменная room)
  3. пишете на этой бумажке адрес дома.

После, когда вы вызывете какую то функцию

private static void test(Room copyOfRoom){
{
    ...  
}

test(room);

вы

  1. Берете вторую бумажку copyOfRoom
  2. Копируете туда адрес вашего объекта
  3. Отправляете эту новую бумажку почтой россии в вашу функцию

Далее, когда вы делаете следующее в фунцкции

private static void test(Room copyOfRoom){
{
    ...  
    copyOfRoom = null;
}

вы

  1. Берете эту копию бумажки с адресом copyOfRoom
  2. Стираете старый адрес с копии.

При этом ваш изначальный объект не меняется. Ваша изначальная бумажка с адресом тоже не меняется, она также указывает на первый объект. Все, что происходит, - это просто кто то что то делает с копией бумажки, которая была выслана в функцию и там и останется.


ps. Ответ по мотивам этого, по идее дубликат, но там C#, а тут Java, не был уверен, что лучше, копипаста или закрытие вопроса.

→ Ссылка