Объясните почему такое поведение у обьекта
Вопрос теоретический. У меня есть объект, предположим 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 шт):
Допустим, ваш изначальный Room (объект) - это дом. Переменная - это, по сути, бумажка с адресом дома. То есть вот тут
Room room = new Room();
вы
- Создаете дом, где поселяется и живет объект
- создаете бумажку (переменная room)
- пишете на этой бумажке адрес дома.
После, когда вы вызывете какую то функцию
private static void test(Room copyOfRoom){
{
...
}
test(room);
вы
- Берете вторую бумажку copyOfRoom
- Копируете туда адрес вашего объекта
- Отправляете эту новую бумажку почтой россии в вашу функцию
Далее, когда вы делаете следующее в фунцкции
private static void test(Room copyOfRoom){
{
...
copyOfRoom = null;
}
вы
- Берете эту копию бумажки с адресом copyOfRoom
- Стираете старый адрес с копии.
При этом ваш изначальный объект не меняется. Ваша изначальная бумажка с адресом тоже не меняется, она также указывает на первый объект. Все, что происходит, - это просто кто то что то делает с копией бумажки, которая была выслана в функцию и там и останется.
ps. Ответ по мотивам этого, по идее дубликат, но там C#, а тут Java, не был уверен, что лучше, копипаста или закрытие вопроса.