
- •Глава 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
Глава 8. Наследование 211
тированным проектированием для обеспечения многократного использования кода и устойчивости к ошибкам. Способность существующих кодовых библиотек вызвать методы на экземплярах новых классов без перекомпиляции и при поддержке ясного абстрактного интерфейса — чрезвычайно мощный инструмент языка Java.
Применение переопределения методов
Рассмотрим более практический пример, который использует переопределение метода. Следующая программа создает суперкласс с именем Figure, который хранит размеры различных двумерных объектов. Он также определяет метод с именем area (), который вычисляет площадь объекта. Программа определяет также два подкласса Figure. Первый — Rectangle, а второй — Triangle. Каждый из этих подклассов переопределяет area () так, чтобы он возвращал площадь прямоугольника и треугольника, соответственно.
// Использование полиморфизма времени выполнения, class Figure {
double diml;
double djjn2;
Figure(double a, double b) {
diml = a;
dim2 = b; }
double area() {
System.out.println("Площадь Figure не определена."); return 0; } }
class Rectangle extends Figure { Rectangle(double a, double b) {
super (a, b); }
// переопределить area для прямоугольника double area{) {
System.out.println("Внутри Area для Rectangle."); return diml * dim2; } }
class Triangle extends Figure { Triangle(double a, double b) {
super(a, b); }
212 Часть I. Язык Java
11 переопределить area для прямоугольного треугольника double area() {
System.out.println("Внутри Area для Triangle."}; return diml * dim2 / 2; } }
class FindAreas {
public static void main(String args [ ]) { Figure f = new Figure(10, 10); Rectangle r = new Rectangle(9, 5); Triangle t = new Triangle(10, 3);
Figure figref;
figref = r;
System.out.println("Площадь равна " + figref.area (});
figref = t;
System.out.println("Площадь равна " + figref.area());
figref = f;
System.out.println("Площадь равна " + figref.area()); } }
Вывод этой программы:
Внутри Area для Rectangle.
Площадь равна 45
Внутри Area для Triangle.
Площадь равна 40
Площадь Figure не определена.
Площадь равна О
Через двойные механизмы наследования и полиморфизма времени выполнения можно определить один непротиворечивый интерфейс, который используется несколькими различными, но связанными типами объектов. В этом случае, если объект является производным от Figure-объекта, то его площадь может быть получена с помощью вызова метода area о. Интерфейс этой операции один и тот же, независимо от того, какой тип фигуры применяется.
Использование абстрактных классов
Существуют ситуации, когда нужно определить суперкласс, который объявляет структуру некоторой абстракции без законченной реализации каждого метода. То есть, иногда необходимо создать суперкласс, определяющий
Глава 8. Наследование 213
только обобщенную форму, которая будет раздельно использоваться всеми его подклассами, предоставляя каждому подклассу возможность заполнить ее своими деталями. Такой класс определяет только природу методов, конкретно реализуемых подклассами. Подобная ситуация может возникнуть, например, когда суперкласс не способен создать значимую реализацию метода. В этом случае находится класс Figure в предыдущем примере. Определение area о можно рассматривать в качестве "хранителя места". Метод не вычисляет и не отображает площадь ни для какого объекта.
При создании собственных библиотек классов вовсе не обязательно иметь сколько-нибудь значимое определение методов в контексте их суперклассов. Управлять этой ситуацией можно двумя способами. Во-первых, как показано в предыдущем примере, можно просто выдать предупреждающее сообщение. Хотя этот подход в некоторых ситуациях, таких как отладка, может быть полезен, обычно он неприемлем. Во-вторых, существует возможность определять методы суперкласса, которые должны быть переопределены подклассом для того, чтобы приобрести для указанного подкласса определенное значение. Рассмотрим класс Triangle. В этом случае не имеет никакого значения, определен метод area о или нет. Вы просто хотите иметь некоторый способ, гарантирующий, что подкласс действительно переопределяет все необходимые методы. Решением этой проблемы является абстрактный метод.
Можно потребовать, чтобы некоторые методы были переопределены подклассами с помощью модификатора типа abstract. Эти методы иногда называют методами, "отданными на ответственность подклассу" (subclasser responsibility), потому что для них не определено никакой реализации в суперклассе. Таким образом, подкласс обязательно должен переопределить их — он не может просто использовать версию, определенную в суперклассе. Для объявления абстрактного метода используется следующая общая форма:
abstract type (parameter-list);
Обратите внимание, что тело метода отсутствует.
Любой класс, который содержит один и более абстрактных методов, должен также быть объявлен абстрактным. Чтобы объявить абстрактный класс, просто используйте ключевое слово abstract перед ключевым словом class в начале объявления класса. Нельзя создавать никакие объекты абстрактного класса. То есть для абстрактного класса нельзя прямо создать объект с помощью операции new. Такие объекты были бы бесполезны, потому что абстрактный класс определен не полностью. Вы не можете также объявлять абстрактные конструкторы или абстрактные статические методы. Любой подкласс абстрактного класса должен или реализовать все абстрактные методы суперкласса, или сам должен быть объявлен как abstract.
Далее показан простой пример класса с абстрактным методом, за которым следует класс, реализующий данный метод:
214 Часть I. Язык Java
I/ Простая демонстрация абстракций Java, abstract class A f
abstract void callme ();
// в абстрактных классах допустимы обычные методы void callmetoo() {
System.out.println("Это конкретный метод."); } }
class В extends A {
void callme() (
System.out.println("В — реализация callme.");
} }
class AbstractDemo {
public static void main(String args[]) { В b = new В();
b. callme () ; b.callmetoo();
> }
Обратите внимание, что никакие объекты класса а не объявлены в программе. Как сказано выше, невозможно определять экземпляры (объекты) абстрактного класса. Кроме того, класс а реализует конкретный метод с именем caiimetooo. Это вполне допустимо. Абстрактные классы могут включать столько реализаций, сколько необходимо.
Хотя абстрактные классы не могут использоваться для создания объектов, их можно использовать для создания объектных ссылок, потому что подход Java к полиморфизму времени выполнения реализован с помощью ссылок суперкласса. Таким образом, возможно создавать ссылку к абстрактному классу так. чтобы она могла использоваться для указания на объект подкласса. Вы увидите использование этого свойства в следующем примере.
Применяя абстрактный класс, можно улучшать класс Figure, показанный ранее. Так как нет никакой значимой концепции (правила) для вычисления площади произвольной двумерной фигуры, следующая версия программы объявляет метод area () как абстрактный внутри Figure. Это, конечно, означает, что все классы, производные от Figure, должны переопределить area ().
// Использование абстрактных методов и классов, abstract class Figure (
double diml ;
double dim2;