Читаем Философия 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

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных