Вход/Регистрация
Философия Java3
вернуться

Эккель Брюс

Шрифт:

• Проводится инициализация членов класса в порядке их объявления.

• Вызывается тело конструктора производного класса.

Порядок вызова конструкторов немаловажен. При наследовании вы располагаете полной информацией о базовом классе и можете получить доступ к любому из его открытых (public) или защищенных (protected) членов. Следовательно, при этом подразумевается, что все члены базового класса являются действительными в производном классе. При вызове нормального метода известно, что конструирование уже было проведено, поэтому все части объекта инициализированы. Однако в конструкторе вы также должны быть уверены в том, что все используемые члены уже проинициализированы. Это можно гарантировать только одним способом — сначала вызывать конструктор базового класса. В дальнейшем при выполнении конструктора производного класса можно быть уверенным в том, что все члены базового класса уже инициализированы. Гарантия действительности всех членов в конструкторе — важная причина, по которой все встроенные объекты (то есть объекты, помещенные в класс посредством композиции) инициализируются на месте их определения (как в рассмотренном примере сделано с объектами Ь, с и I). Если вы будете следовать этому правилу, это усилит уверенность в том, что все члены базового класса и объекты-члены были проинициализированы. К сожалению, это помогает не всегда, в чем вы убедитесь в следующем разделе.

Наследование и завершающие действия

Если при создании нового класса используется композиция и наследование, обычно вам не приходится беспокоиться о проведении завершающих действий — подобъекты уничтожаются сборщиком мусора. Но если вам необходимо провести завершающие действия, создайте в своем классе метод dispose (в данном разделе я решил использовать такое имя; возможно, вы придумаете более удачное название). Переопределяя метод dispose в производном классе, важно помнить о вызове версии этого метода из базового класса, поскольку иначе не будут выполнены завершающие действия базового класса. Следующий пример доказывает справедливость этого утверждения:

//: polymorphism/Frog.java

// Наследование и завершающие действия.

package polymorphism;

import static net.mindview util.Print.*;

class Characteristic { private String s;

CharacteristicCString s) { this s = s;

print("Создаем Characteristic " + s);

}

protected void disposeO {

print("Завершаем Characteristic " + s);

class Description {

private String s;

Description(String s) { this s = s.

print("Создаем Description " + s).

}

protected void disposeO {

print("Завершаем Description " + s);

}

}

// живое существо class LivingCreature {

private Characteristic p =

new Characteristic"живое существо");

private Description t =

new Description("обычное живое существо");

LivingCreatureO {

printCLivingCreatureO");

}

protected void disposeO {

print("dispose в LivingCreature "), t.disposeO; p.disposeO;

// животное

class Animal extends LivingCreature { private Characteristic p =

new Characteristic("имеет сердце"); private Description t =

new Descripti0n(">khb0th0e. не растение"); Animal О { print("Animal"); } protected void disposeO {

print("disposeO в Animal "); t.disposeO; p.disposeO; super, di sposeO;

// земноводное

class Amphibian extends Animal { private Characteristic p =

new Characteristic"может жить в воде"); private Description t =

new Descriptions в воде, и на земле"); Amphibian О { продолжение &

// лягушка

public class Frog extends Amphibian {

private Characteristic p = new CharacteristicC'KBaKaei"). private Description t = new Description"ест жуков"), public FrogO { printC'FrogO"), } protected void disposeO {

print С завершение Frog"), t disposeO; p disposeO; super.disposeO;

}

public static void main(String[] args) { Frog frog = new FrogO; print("Пока!"); frog. disposeO;

}

} /* Output:

Создаем Characteristic живое существо Создаем Description обычное живое существо LivingCreatureO

Создаем Characteristic имеет сердце Создаем Description животное, не растение Animal О

Создаем Characteristic может жить в воде Создаем Description и в воде, и на земле Amphibian О

Создаем Characteristic квакает Создаем Description ест жуков FrogO Пока!

завершение Frog

Завершаем Description ест жуков Завершаем Characteristic квакает disposeO в Amphibian

Завершаем Description и в воде, и на земле Завершаем Characteristic может жить в воде disposeO в Animal

Завершаем Description животное, не растение Завершаем Characteristic имеет сердце disposeO в LivingCreature Завершаем Description обычное живое существо Завершаем Characteristic живое существо *///:-

Каждый класс в иерархии содержит объекты классов Characteristic и Description, которые также необходимо «завершать». Очередность завершения должна быть обратной порядку инициализации в том случае, если объекты

  • Читать дальше
  • 1
  • ...
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: