Деструкторов в Java нет, но есть функция finalize. Она автоматически вызывается системой, когда обнаруживается, что объект больше не используется. Память, занятая объектом, помечается как свободная. Неизвестно когда будет, если вообще будет вызван метод finalize. Поэтому не стоит на него полагаться, но можно его использовать как средство оптимизации.
Деструкторам свойственны многие черты обычных функций-членов класса, но существуют и свои особенности.
Деструкторы не могут описываться как функции, возвращающие значение (даже типа void).
Деструктор не имеет параметров.
Имя деструктора – имя класса, которому предшествует символ ~.
Нельзя получить адрес деструктора.
Если они явно не описаны, то деструкторы автоматически создаются компилятором.
Деструктор может быть вызван как обычная функция с указанием полного имени.
Ints(100), *ps = new Int(50);
s.~Int(); // явное разрушение s
ps->~Int(); // явное разрушение
Компилятор автоматически вставляетвызовы деструктора при уничтожении объекта.
Деструктор автоматически вызывается компилятором:
при выходе из области видимости;
при создании временных объектов для преобразования в выражениях или для передачи функциям аргументов;
когда возвращенные функцией значения более не нужны;
при выполнении операции delete для объектов, размещенных в динамической памяти.
Объект в свободной памяти: уничтожается с помощью операции delete в С++ и механизма "сборки мусора" в Java.
38.