Переменные атрибутов класса - хранятся ли ссылки или новый объект? - PullRequest
1 голос
/ 14 июля 2020

Допустим, у меня есть код:

public static void main(String[] args) {
    Animal r1 = new Animal(10,"Amanda");
    House c = new House(100, r1);
    r1.setAge(3);
    
    House c2 = new House(101, r1);
    System.out.println(c);
    System.out.println(c2);
}

Результат:

3 Amanda

3 Amanda

Таким образом, похоже, что java сохраняет ссылку на r1 в значении поля Animal in House, чтобы любые изменения самого объекта отражались в любом вызове переменной Animal в классе House. Это оно? Или java создает совершенно новый объект?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Ваше предположение верно. Java сохраняет ссылку на животное, на которое указывает r1.

Обратите внимание, что это не то же самое, что и передача по ссылке. Java всегда передается по значению, но сами значения являются ссылками.

Это означает, что если вы вызываете конструктор House внутри конструктора, вы назначаете новый объект переданному в

public House(int id, Animal animal) {
    animal = new Animal(11, "Bertha");
}
Animal r1 = new Animal(10,"Amanda");
House c = new House(100, r1);
System.out.println(r1);

Таким образом, вышеупомянутый println по-прежнему печатает «Аманда» (а не «Берта»). Переменная r1, переданная в конструктор, не то же самое, что переменная animal, используемая в конструкторе. Значение ссылки из r1 равно скопировано в animal. Переназначение animal не влияет на r1.

0 голосов
/ 14 июля 2020

Оба этих объекта House имеют ссылку на один и тот же объект Animal, как вы и подозревали.

Обратите внимание, что это поведение только для объектов, а не для примитивов (int, boolean, float, double, char , ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...