В Java, когато създаваме обект от класа, той заема известно място в паметта (купчина). Ако не изтрием тези обекти, той остава в паметта и заема ненужно място, което не е изправено от гледна точка на програмиране. За да разрешим този проблем, ние използваме разрушител . В този раздел ще обсъдим алтернативната опция на деструктор в Java . Освен това ще научим как да използваме финализирам() метод като деструктор.
The разрушител е обратното на конструктора. Конструкторът се използва за инициализиране на обекти, докато деструкторът се използва за изтриване или унищожаване на обекта, който освобождава ресурса, зает от обекта.
Не забравяйте, че в Java няма концепция за деструктор . Вместо деструктора, Java предоставя събирача на отпадъци, който работи по същия начин като деструктора. Събирачът на боклук е програма (нишка), която работи на JVM . Той автоматично изтрива неизползваните обекти (обекти, които вече не се използват) и освобождава паметта. Програмистът няма нужда да управлява паметта ръчно. Той може да бъде податлив на грешки, уязвим и може да доведе до изтичане на памет.
Какво представлява деструкторът в Java?
Това е специален метод, който автоматично се извиква, когато даден обект вече не се използва. Когато даден обект завърши своя жизнен цикъл, събирачът на отпадъци изтрива този обект и освобождава или освобождава паметта, заета от обекта.
Известен е още като финализатори които са недетерминирани. в Java , разпределянето и освобождаването на обекти, управлявани от боклукчия . Извикването на финализатори не е гарантирано, защото се извиква имплицитно.
Предимства на Destructor
- Освобождава ресурсите, заети от обекта.
- Не е необходимо изрично извикване, то се извиква автоматично в края на изпълнението на програмата.
- Не приема никакъв параметър и не може да бъде претоварен.
Как работи деструкторът?
Когато обектът е създаден, той заема мястото в купчината. Тези обекти се използват от нишките. Ако обектите вече не се използват от нишката, стават подходящи за събиране на боклук. Паметта, заета от този обект, вече е достъпна за нови обекти, които се създават. Трябва да се отбележи, че когато събирачът на отпадъци унищожи обекта, JRE извиква метода finalize(), за да затвори връзките като база данни и мрежова връзка.
От горното можем да заключим, че използването на деструктор и събирач на боклук е нивото на намеса на разработчиците в управлението на паметта. Това е основната разлика между двете. Деструкторът уведомява точно кога обектът ще бъде унищожен. Докато в Java събирачът на боклук върши същата работа автоматично. Тези два подхода за управление на паметта имат положителни и отрицателни ефекти. Но основният проблем е, че понякога разработчикът се нуждае от незабавен достъп до управлението на паметта.
Java finalize() метод
За програмиста е трудно да изпълни принудително събирача на отпадъци, за да унищожи обекта. Но Java предоставя алтернативен начин да направите същото. Класът Java Object предоставя финализирам() метод, който работи по същия начин като деструктора. Синтаксисът на метода finalize() е както следва:
Синтаксис:
protected void finalize throws Throwable() { //resources to be close }
Не е деструктор, но осигурява допълнителна сигурност. Той гарантира използването на външни ресурси като затваряне на файл и т.н. преди изключване на програмата. Можем да го извикаме, като използваме самия метод или извикаме метода System.runFinalizersOnExit(true) .
- Това е защитен метод на класа Object, който е дефиниран в пакета java.lang.
- Може да се извика само веднъж.
- Трябва изрично да извикаме метода finalize(), ако искаме да заменим метода.
- gc() е метод на JVM, изпълняван от Garbage Collector. Той се извиква, когато паметта на стека е пълна и изисква повече памет за нови пристигащи обекти.
- С изключение на непроверените изключения, JVM игнорира всички изключения, които възникват от метода finalize().
Пример за деструктор
DestructorExample.java
public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } }
Изход:
Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector