
- •Глава 2
- •Глава 2. Обзор языка Java 31_
- •Глава 2. Обзор языка Java
- •Глава 2. Обзор языка Java 37
- •Глава 2. Обзор языка Java 39
- •Глава 2. Обзор языка Java 41
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 43_
- •Глава 2. Обзор языка Java 45_
- •Глава 2. Обзор языка Java 47
- •Глава 2. Обзор языка Java 49_
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 57
- •Глава 3
- •Глава 3. Типы данных, переменные и массивы 53
- •Глава 3. Типы данных, переменные и массивы _ 55
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 59_
- •Глава 3. Типы данных, переменные и массивы 61_
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 65_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 67_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 69_
- •Глава 3. Типы данных, переменные и массивы 71_
- •Глава 3. Типы данных, переменные и массивы 73_
- •Глава 3. Типы данных, переменные и массивы
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы _ 77_ Эта программа генерирует следующий вывод:
- •Глава 3. Типы данных, переменные и массивы 79
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 81_
- •Глава 4
- •Глава 4. Операции 83
- •84 Часть I. Язык Java
- •Глава 4. Операции 85_
- •Глава 4. Операции 87_
- •88_ Часть I. Язык Java
- •Глава 4. Операции 89
- •Глава 4. Операции 91_
- •Глава 4. Операции 93_
- •Глава 4. Операции 95_
- •Глава 4. Операции 97_
- •Глава 4. Операции 99
- •Глава 4. Операции 101
- •Глава 4. Операции 103
- •104 Часть I, Язык Java
- •Глава 4. Операции 105
- •Глава 5
- •Глава 5, Управляющие операторы 107
- •Глава 5. Управляющие операторы 109
- •110 Часть I. Язык Java
- •Глава 5, Управляющие операторы 111
- •Глава 5. Управляющие операторы 113
- •Глава 5. Управляющие операторы
- •Глава 5. Управляющие операторы 117
- •118 Часть I. Язык Java
- •Глава 5. Управляющие операторы 119
- •Глава 5. Управляющие операторы 121
- •122 Часть I. Язык Java
- •Глава 5. Управляющие операторы 123
- •Глава 5. Управляющие операторы 125
- •Глава 5. Управляющие операторы 127
- •Глава 5. Управляющие операторы 129
- •Глава 5. Управляющие операторы
- •Глава 6
- •134 Часть I. Язык Java
- •Глава 6. Введение в классы 135
- •136 Часть I. Язык Java
- •Глава 6. Введение в классы _ 137
- •Глава 6. Введение в классы 139
- •Глава 6. Введение в классы
- •Глава 6. Введение в классы 143
- •Глава 6. Введение в классы 145
- •Глава 6. Введение в классы 147
- •Глава 6. Введение в классы 149
- •Глава 6. Введение в классы 151
- •154 Часть I. Язык Java
- •Глава 6. Введение в классы 155
- •Глава 6. Введение в классы 157
- •Глава 7
- •Глава 7. Методы и классы 159
- •Глава 7. Методы и классы . 161
- •Глава 7. Методы и классы • 163
- •164 Часть I. Язык Java
- •Глава 7. Методы и классы 165
- •Глава 7. Методы и классы 167
- •Глава 7. Методы и классы 169
- •Глава 7, Методы и классы 171-
- •Глава 7. Методы и классы 173
- •Глава 7. Методы и классы 775
- •Глава 7. Методы и классы 177
- •Глава 7. Методы и классы ' 179
- •Глава 7. Методы и классы 1_81_
- •Глава 7. Методы и классы 1_83
- •184 '• Часть I. Язык Java
- •Глава 7. Методы и классы . 185
- •Глава 7. Методы и классы 187
- •Глава 8
- •Глава 8. Наследование 191
- •Глава 8. Наследование 193
- •Глава 8, Наследование 195
- •Глава 8. Наследование 197
- •198 Часть I. Язык Java
- •Глава 8, Наследование 199
- •Глава 8. Наследование 201
- •202 Часть I. Язык Java
- •Глава 8. Наследование 203
- •Глава 8. Наследование 205
- •Глава 8. Наследование 207
- •Глава 8. Наследование 209
- •Глава 8. Наследование 211
- •Глава 8. Наследование 213
- •Глава 8. Наследование 215
- •Глава 8. Наследование 217
- •Глава 12
- •Глава 12. Ввод/вывод, апплеты и другие темы 303_
- •Глава 12. Ввод/вывод, апплеты и другие темы . 305
- •Глава 12. Ввод/вывод, алплеты и другие темы 307
- •Глава 12. Ввод/вывод, апплеты и другие темы 309
- •Глава 12. Ввод/вывод, апплеты и другие темы 311
- •Глава 12. Ввод/вывод, апплаты и другие темы 313
- •314 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 315
- •Глава 12. Ввод/вывод, апплеты и другие темы 317
- •Глава 12. Ввод/вывод, апплеты и другие темы 319
- •320 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 321
- •Глава 12. Ввод/вывод, апплеты и другие темы 323
- •324 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 325
- •326 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплегы и другие темы 327
Глава 2. Обзор языка Java
33
Наследование
Наследование есть процесс, с помощью которого один объект приобретает свойства другого объекта. Оно важно потому, что поддерживает концепцию иерархической классификации. Как уже говорилось выше, наибольшая часть знаний становится управляемой только с помощью иерархических (т. е. организованных "сверху вниз") классификаций. Например, порода поисковых охотничьих собак Golden Retriever является частью классификации dog (собаки), которая, в свою очередь, есть часть класса Memmal (млекопитающие) — подкласса большого класса Animal (животные). Без применения классификаций каждый объект нуждался бы в явном определении всех своих характеристик. При использовании наследования объект нуждается в определении только тех качеств, которые делают его уникальным в собственном классе. Он может наследовать общие свойства от своего родителя. Поэтому именно механизм наследования дает возможность одному объекту быть специфическим экземпляром более общего случая. Рассмотрим этот процесс поподробнее.
Большинство людей, естественно, видит мир, состоящим из объектов, которые связаны друг с другом иерархическим способом, например, из животных, млекопитающих и собак. Если бы вы хотели описать животных абстрактным образом, вам следовало бы определить их некоторые атрибуты, например размер, интеллект и тип скелетной системы. Животные также обладают некоторыми поведенческими аспектами — они едят, дышат и спят. Такое описание атрибутов и поведения и определяет класс для животных.
Если бы вы хотели описать более специфичный класс животных, такой как млекопитающие, они бы должны были иметь более специфичные атрибуты, такие как тип зубов и молочные железы. Подобный класс известен как подкласс животных, тогда как о классе животных говорят как о суперклассе.
Так как млекопитающие есть более точно специфицированные животные, то говорят, что они наследуют все атрибуты животных. Подкласс, находящийся на более глубоком уровне иерархии, наследует все атрибуты каждого своего предка в иерархии классов (рис. 2.2).
34 Часть I. Язык Java
С Животные ,
Рис. 2.2. Схема иерархии классов
Наследование взаимодействует также и с инкапсуляцией. Если данный класс инкапсулирует некоторые атрибуты, то любой подкласс будет иметь те же атрибуты плюс атрибут, который он добавляет как часть своей специализации (рис. 2.3). Это ключевая концепция, которая позволяет объектно-ориентированным программам расти по сложности линейно, а не геометрически. Новый подкласс наследует все атрибуты всех его предков. Он не имеет непредсказуемых взаимодействий с большинством остальных кодов в системе.
Полиморфизм
Полиморфизм (от греч. — "имеющий много форм") — свойство, которое позволяет использовать один интерфейс для общего класса действий. Специфическое действие определяется точной природой ситуации. Рассмотрим стек (список типа LIFO — Last-In, First-Out). Вы можете иметь программу, которая требует три типа стеков. Один стек используется для целых значений, другой — для значений с плавающей точкой, и третий — для символов. Алгоритм, который реализует каждый стек — один и тот же, хотя хранимые данные различны. В не объектно-ориентированном языке от вас бы потребовалось создать три различных набора стековых подпрограмм, каждый из которых имел бы собственное имя. Вследствие полиморфизма в языке Java можно специфицировать общий для всех типов данных набор стековых подпрограмм, использующих одно и то же имя.
ЛАБРАДОР
Возраст Период беременности Дрессируемый?
Пол Охотничий инстинкт Дрессирован на утиную охоту?
Вес Длина хвоста? Сертифицирован АКС?
Размер помета Комнатный/Дворовый?
Рис. 2.3. Лабрадор наследует свойства всех своих суперклассов
В общем смысле, концепцию полиморфизма часто выражают фразой "один интерфейс, много методов". Это означает, что возможно спроектировать родовой интерфейс для группы связанных объектов. Это позволяет уменьшить сложность, допуская использование одного и того же интерфейса для общего класса действий. Забота компилятора —' выбрать специфическое действие (т. е. метод) для его использования в каждой конкретной ситуации. Вы — программист — не должны делать этот выбор "вручную". Вам нужно только помнить и использовать общий интерфейс.
36 Часть I. Язык Java
Расширяя аналогию с собакой, можно сказать, что обоняние у собаки полиморфно. Если она чует кошку, то лает и бежит за ней. Если чует пищу, выделяет слюну и бежит к миске. В обеих ситуациях одно и то же чувство — обоняние. Разница в том, что именно она нюхает, т. е. в типе данных, с которым оперирует нос собаки! Та же общая концепция реализована и в языке Java относительно методов в Java-программах.
Полиморфизм, инкапсуляция и наследование работают вместе
При правильном применении полиморфизм, инкапсуляция и наследование комбинируются так, что создают некую среду программирования, которая обеспечивает намного более устойчивые и масштабируемые программы, чем модель, ориентированная на процесс. Удачно спроектированная иерархия классов является базисом для повторно используемого кода, в который вы вложили время и усилия при разработке и тестировании. Инкапсуляция позволяет реализациям мигрировать во времени без разрушения кода, который зависит от public-интерфейса классов. Полиморфизм позволяет создавать ясный, чувствительный и читабельный код.
Из двух примеров реальных объектов, приведенных выше, автомобиль полнее иллюстрирует мощь объектно-ориентированного проектирования. Пример с собаками удобно использовать при обдумывании наследования, а пример с автомобилями больше подходит для программирования. При вождении разных типов (подклассов) транспортных средств все водители полагаются на наследование. Независимо от того, является ли транспортное средство школьным автобусом, Mercedes-седаном, Porsche или представителем семейства minivan (крытый фургон), водитель везде может работать с рулем, колесами, тормозами и акселератором. Наслушавшись скрежетаний в коробке передач, большинство людей может даже справиться с различием между рычажным и автоматическим переключением скоростей, потому что они ясно представляют их общий суперкласс — трансмиссию.
Люди постоянно взаимодействуют с инкапсулированными свойствами автомобиля. Педали тормоза и газа скрывают невероятный набор сложностей с настолько простым интерфейсом, что вы можете работать с ним с помощью ног. Работа двигателя, тип тормозов, размер колес не влияют на то, как вы взаимодействуете с определением класса педалей.
Последний атрибут — полиморфизм — ясно отражен в способности производителей автомобилей предлагать широкий набор возможностей для примерно одинаковых транспортных средств. Например, вы можете получить противоблокировочную тормозную систему или традиционные тормоза, рулевое управление с усилителем или реечное управление, 4-, 6- или 8-цилиндровый двигатель. В любом случае, когда вы не хотите двигаться, то будете нажимать педаль тормоза для остановки, поворачивать руль для изменения направления и нажимать акселератор. Один и тот же интерфейс можно использовать для управления различными реализациями.