Создание и удаление объектов Java — основы
В объектно-ориентированном программировании при создании объекта вызывается конструктор. Это блок команд, который инициализирует объект: присваивает значения его параметрам и выполняет начальные действия для подготовки объекта к работе. Конструктор может принимать параметры явно или использовать прописанные в классе значения по умолчанию.
Способы создания объекта Java
Чтобы создать объект, используют ключевое слово new. Вы его наверняка помните по созданию массивов, которые в Java тоже являются объектами. После new указывают тип создаваемого объекта, т.е. класс. В Java, как и в других ООП-языках, можно использовать встроенные классы и определять пользовательские.
Класс — это шаблон, по которому создаётся экземпляр — объект. Класс определяет свойства и поведение будущего объекта. Команда «Изготовь шестигранную гайку» имеет смысл, только если исполнитель понимает, что такое гайка. Именно класс описывает свойства «гайки» и указывает, что с ней можно делать.
Допустим, у нас есть класс Item («предмет»), где прописано, что каждый предмет имеет габариты и свойство moveable, которое определяет, можно ли предмет двигать:
class Item { int height = 5; int width = 5; int depth = 5; boolean isMoveable = false;
// А вот конструктор Item(int userHeight, int userWidth, int userDepth, boolean itemIsMoveable) { // присваиваем пользовательские значения width = userHeight; height = userWidth; depth = userDepth; moveable = itemIsMoveable; } }
Чтобы создать экземпляр toolbox («ящик с инструментами») класса Item, заведём переменную для хранения ссылки на объект, а затем запустим конструктор:
Item toolbox;
toolbox = new Item (7, 2, 4, true);
При создании ящика мы переопределили его параметры. Если бы нас устраивали значения по умолчанию, мы создали бы ящик без параметров:
box = new Item();
Динамическое создание объектов Java
Объекты создаются и исчезают во время работы приложений. Вы заказали новый юнит в игре — он появился, отправили его сражаться — он погиб. У каждого объекта свой жизненный цикл: от создания до уничтожения.
Память для хранения данных об объекте выделяется и высвобождается. Причем специально удалять неиспользуемый объект не нужно — для этого в Java есть сборщик мусора. Он автоматически запускается и стирает объекты, которые уже не планируется вызывать. Как он их находит? По отсутствию дальнейших обращений к этим объектам (ссылок на них).
В Джаве нет деструктора в привычном понимании. Есть метод finalize — он вызывается, когда за объектом приходит сборщик мусора. Но есть у этого метода особенности, из-за которых его редко используют на практике:
- неизвестно, в какой момент он будет вызван и будет ли вызван вообще — программа может завершиться раньше;
- он замедляет работу сборщика мусора с объектом более чем в 400 раз;
- объекты утилизируются не сразу, а попадают в очередь на финализацию и продолжают занимать память неопределённое время.
Зачем же этот метод существует в языке?
- Для составления «описи» объектов, которые не используются, но и не удалены — через поиск и логирование.
- Для высвобождения ресурсов при работе с нативным кодом: например, С.
Более толковый помощник в борьбе за свободные ресурсы — интерфейс AutoCloseable — позволяет закрывать потоки, файлы, соединения с БД и др. Чтобы воспользоваться интерфейсом, нужно реализовать его единственный метод, сlose(), в классе, объекты которого вы планируете закрывать:
public class SampleClass implements AutoCloseable { //указали, что наш класс реализует интерфейс AutoCloseable
public void do_something() { // метод класса, который делает что-то нужное
System.out.println("Вызван метод класса.");
}
@Override
public void close() throws Exception {// реализуем close()
System.out.println("Объект отработал, высвобождаем ресурсы.");
}
}
Вызвать метод можно в конструкции try-с-ресурсами:
private static void SampleClass() throws Exception {
try(SampleClass sc1 = new SampleClass()){
sc1.do_something();
}
}
Открыли ресурс, запустили выполнение задачи, завершили выполнение, закрыли ресурс.
Также рекомендуем посмотреть вебинар по созданию консольных приложений на Java, где будут рассматриваться объекты и классы.