Уничтожение объектов Java
Здравствуйте. Сейчас читаю Tinking in java и наткнулся на вопрос, который не даёт покоя. Экель пишет, что ненужные объекты удаляет garbage collector, но есть случаи, когда это нужно делать вручную. Приведу отрывок из книги:
Если при создании нового класса используется композиция и наследование, обычно вам не приходится беспокоиться о проведении завершающих действий — подобъекты уничтожаются сборщиком мусора. Но если вам необходимо провести завершающие действия, создайте в своем классе метод dispose() (в данном разделе я решил использовать такое имя; возможно, вы придумаете более удачное название). Переопределяя метод dispose() в производном классе, важно помнить о вызове версии этого метода из базового класса, поскольку иначе не будут выполнены завершающие действия базового класса. Следующий пример доказывает справедливость этого утверждения://: polymorphism/Frog.java // Наследование и завершающие действия. package polymorphism; import static net.mindview.util.Print.*; class Characteristic { private String s; Characteristic(String s) { this.s = s; print("Creating Characteristic " + s); } protected void dispose() { print("disposing Characteristic " + s); } } class Description { private String s; Description(String s) { this.s = s; print("Creating Description " + s); } protected void dispose() { print("disposing Description " + s); } } // живое существо class LivingCreature { private Characteristic p = new Characteristic("is alive"); private Description t = new Description("Basic Living Creature"); LivingCreature() { print("LivingCreature()"); } protected void dispose() { print("LivingCreature dispose"); t.dispose(); p.dispose(); } } // животное class Animal extends LivingCreature { private Characteristic p = new Characteristic("has heart"); private Description t = new Description("Animal not Vegetable"); Animal() { print("Animal()"); } protected void dispose() { print("Animal dispose"); t.dispose(); p.dispose(); super.dispose(); } } // земноводное class Amphibian extends Animal { private Characteristic p = new Characteristic("can live in water"); private Description t = new Description("Both water and land"); Amphibian() { print("Amphibian()"); } protected void dispose() { print("Amphibian dispose"); t.dispose(); p.dispose(); super.dispose(); } } // лягушка public class Frog extends Amphibian { private Characteristic p = new Characteristic("Croaks"); private Description t = new Description("Eats Bugs"); public Frog() { print("Frog()"); } protected void dispose() { print("Frog dispose"); t.dispose(); p.dispose(); super.dispose(); } public static void main(String[] args) { Frog frog = new Frog(); print("Bye!"); frog.dispose(); } }
(Наследование и завершающие действия)
я не пойму следующее:
1. когда возникают такие случаи.
2. каким образом создание нового метода поможет избавится от нежелательных ссылок.
p.s.: Простите за, возможно глупый вопрос, но так и не нашел в интернете на него ответ((
45 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів