Как вернуть уже существующий объект класса и изменить его?
public class Movie {
public String name;
public String description;
public int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Movie(String name, String description, int price) {
this.name = name;
this.description = description;
this.price = price;
}
}
Затем, я создаю объект класса:
new Movie(name, description, price);
И еще несколько таких объектов с разными данными.
Затем, я хочу изменить данные объектов. Могу ли я это сделать? И где они в данный момент хранятся? Только в оперативной памяти? Есть ли какой-то метод поиска существующих объектов по одному из его полей, указанных в конструкторе? Или для этого необходимо обязательно где-то сохранить эти объекты, например, в ArrayList? При создании нового экземпляра класса предыдущий экземпляр удаляется из памяти?
Ответы (2 шт):
Вам нужна ссылка для объекта, чтобы вы могли как-то с ним оперировать. Либо Movie movie = new Movie(name, description, price);, либо добавить в список или массив, тогда ссылкой будет соответствующая ячейка: list.get(0) или array[0] например.
я хочу изменить данные объектов. Могу ли я это сделать?
Да. У вас для этого в приведённом вами коде есть методы. Например:
public void setDescription(String description) {
this.description = description;
}
Ничто не мешает вам вызвать этот метод у созданного объекта и передать туда новое значение. Вот так: movie.setDescription("Голубая луна джунглей");
При создании нового экземпляра класса предыдущий экземпляр удаляется из памяти?
Нет. Вы же можете сделать вот так:
Movie movie = new Movie("Мир дикого Востока", description, price);
Movie movie1 = new Movie("Принесённые ветром", description, price);
Movie movie2 = new Movie("Вперёд в прошлое", description, price);
У вас здесь несколько экземпляров одного класса и вы можете работать с ними одновременно. Но если вы сделали вот так:
Movie movie = new Movie("Шестой батальон", description, price);
movie = new Movie("В бегство!", description, price);
то есть одной и той же ссылке присвоили сначала первый объект, а потом второй, то первый объект рано или поздно будет уничтожен сборщиком мусора (при условии, что на него больше нигде нет ссылок).
Есть ли какой-то метод поиска существующих объектов по одному из его полей, указанных в конструкторе?
Чтобы что-то искать, вы сначала должны понять, что, как и зачем вы хотите искать. Можно искать в списке. При помощи цикла, например:
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getDescription.equals("Один друг Маушена")) {
return list.get(i);
}
}
или Stream API:
list.stream().filter(m -> m.getDescription.equals("Один друг Маушена")).findFirst();
Затем, я хочу изменить данные объектов. Могу ли я это сделать?
Да. У вас в классе объявлены сеттеры (методы вида setSomething()). Они предназначены для того, чтобы менять состояния объектов.
И где они в данный момент хранятся? Только в оперативной памяти?
Да, они в оперативной памяти. При этом, если вы не сохраняли ссылки на эти объекты в переменные, то очень скоро (хотя никто не знает когда) сборщик мусора их удалит.
Есть ли какой-то метод поиска существующих объектов по одному из его полей, указанных в конструкторе? Или для этого необходимо обязательно где-то сохранить эти объекты, например, в ArrayList?
Ссылку на один объект обычно сохраняют в простую переменную. Например так:
Movie mov1 = new Movie("Ирония судьбы", "Новогодняя комедия", 100);
Здесь mov1 -- ссылка на только созданный объект.
Если нужно создать несколько объектов, то их можно сохранить в несколько переменных. А те сложить в один список или один массив, как больше нравится:
Movie mov1 = new Movie("Ирония судьбы", "Новогодняя комедия", 100);
Movie mov2 = new Movie("Операция Ы", "Советская комедия", 100);
List<Movie> movies = new ArrayList<>();
movies.add(mov1);
movies.add(mov2);
Чтобы найти фильм по одному из полей, можно, например, перебрать список (List) фильмов и выбрать тот, поле которого соответствует нужному критерию. Например, найти такой, поле name которого эквивалентно строке "Ирония судьбы".
Для этого есть разные способы и здесь их объяснять долго. Некоторые из них относятся к базовому синтаксису языка и вам просто нужно пройти тему "Циклы" в учебнике.
При создании нового экземпляра класса предыдущий экземпляр удаляется из памяти?
Нет, ни в коем случае. Объект удалится из памяти только тогда, когда все ссылки на него пропадут из области видимости. Это ещё одна отдельная тема, которую, к сожалению, не раскрыть в рамках комментария.