Читаем Философия Java3 полностью

В этом примере создается сложный класс, собранный из других классов, и в каждом классе имеется конструктор, который сообщает о своем выполнении. Самый важный класс — Sandwich, с тремя уровнями наследования (четырьмя, если считать неявное наследование от класса Object) и тремя встроенными объектами. Результат виден при создании объекта Sandwich в методе main(). Это значит, что конструкторы для сложного объекта вызываются в следующей последовательности:

• Сначала вызывается конструктор базового класса. Этот шаг повторяется рекурсивно: сначала конструируется корень иерархии, затем следующий за ним класс, затем следующий за этим классом класс и т. д., пока не достигается «низший» производный класс.

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

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

Порядок вызова конструкторов немаловажен. При наследовании вы располагаете полной информацией о базовом классе и можете получить доступ к любому из его открытых (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

Перейти на страницу:

Похожие книги

Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT