Создание и удаление объектов Java — основы

Конструкторы и деструкторы.
23 октября 2017Cbc0f0509128ea8a7487ec71c1240fb531db396bМария Лисянская1535216

В объектно-ориентированном программировании при создании объекта вызывается конструктор. Это блок команд, который инициализирует объект: присваивает значения его параметрам и выполняет начальные действия для подготовки объекта к работе. Конструктор может принимать параметры явно или использовать прописанные в классе значения по умолчанию.

Способы создания объекта 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();
   }
}

Открыли ресурс, запустили выполнение задачи, завершили выполнение, закрыли ресурс.

Новые комментарии