
- •Глава 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. Наследование 201
subOb.show(); } }
Эта программа выполняет следующий вывод:
1 из суперкласса: 1 i из подкласса: 2
Хотя экземплярная переменная i класса в скрывает i класса a, super позволяет получить доступ к 1, определенной в суперклассе. Кроме того, super можно также использовать для вызова методов, скрытых подклассом.
Создание многоуровневой иерархии
До этого момента мы использовали простые иерархии классов, которые состоят только из суперкласса и подкласса. Однако можно строить иерархии, которые содержат столько уровней наследования, сколько вам нравится. Как уже говорилось, вполне приемлемо использовать подкласс в качестве суперкласса другого класса. Например, при наличии трех классов с именами а, в и с, класс с может быть подклассом в, который, в свою очередь, является подклассом а. В этом случае каждый подкласс наследует все черты всех своих суперклассов. В данном случае с наследует все аспекты вид. Чтобы продемонстрировать пользу многоуровневой иерархии, рассмотрим следующую программу:
// Расширить BoxWeight для включения стоимости отгрузки.
// Начать с класса Box. class Box {
private double width;
private double height;
private double depth;
// создать клон объекта
Box(Box ob) { // передать объект конструктору
width = ob. width/height = ob.height; depth = ob. depth;
}
// конструктор, использующий все размеры Box(double w, double h, double d) (
width = w;
height = h;
depth = d; }
202 Часть I. Язык Java
// конструктор, не использующий размеров
Box () {
width = -1; // использовать -1 для указания
height = -1; // неинициализированного
depth = -1; // блока
}
// конструктор для создания куба Box(double len) {
width = height = depth = len; }
// вычислить и возвратить объем double volume() {
return width * height * depth; } }
// Добавить вес.
class BoxWeight extends Box {
double weight; // вес блока
// создать клон объекта
BoxWeight(BoxWeight ob) { // передать объект конструктору
super(ob);
weight = ob.weight; }
// конструктор, использующий все специфицированные параметры BoxWeight(double w, double h, double d, double m) {
super(w, h, d); // вызвать конструктор суперкласса
weight = m; }
// конструктор по умолчанию BoxWeight() {
super();
weight = -1; }
// конструктор для создания куба BoxWeight(double len, double m) { super(len); weight = m; } }. |
// Добавить стоимость отгрузки class Shipment extends BoxWeight { double cost;
Глава 8. Наследование 203
II построить клон объекта
Shipment(Shipment ob) { // передать объект конструктору
super(ob) ;
cost = ob.cost; }
// конструктор для всех специфицированных параметров Shipment (double w, doubl,e h, double d, double m, double c) {
super(w, h, d, m); // вызвать конструктор суперкласса
cost = с; }
// умалчиваемый конструктор Shipment(} {
super();
cost = -1; }
// конструктор для создания куба
Shipment(double len, double m, double c) {
super {len, m) ;
cost = c; } }
class DemoShipment {
public static void main(String args[]) {
Shipment shipmentl = new Shipment(10, 20, 15, 10, 3.41); Shipment shipment2 = new Shipment(2, 3, 4, 0.76, 1.28);
double vol;
vol = shipmentl.volume();
System.out.println("Объем shipmentl равен " + vol);
System.out.println("Bee shipmentl равен " + shipmentl.weight) ;
System.out.println("Стоимость отгрузки: $" + shipmentl.cost);
System.out.println();
vol = shipment2.volume();
System.out.println("J6beM shipment2 равен " + vol); System.out.println("Bee shipment2 равен " + shipment2.weight); System.out.println("Стоимость отгрузки: 5" + shipment2.cost); } }
Здесь подкласс BoxWeight используется как суперкласс для создания подкласса С Именем Shipment. Shipment наследует все черты BoxWeight И Box И
204 Часть 1. Язык Java
добавляет поле с именем cost (стоимость), которое содержит стоимость отгрузки такого пакета.
Вывод этой программы:
Объем shipment! равен 3000.0 Вес shipment! равен 10.0 Стоимость отгрузки: $3.41 Объем shipment2 равен 24.0 Вес shipment2 равен 0.76 Стоимость отгрузки: $1.28
Из-за наследования shipment может использовать предварительно определенные классы box и Boxweight, добавляя только дополнительную информацию, которая требуется для своего собственного специфического применения. Одно из преимуществ наследования — возможность повторного использования кода.
Этот пример иллюстрирует другой важный аспект: super о всегда обращается к конструктору в самом близком суперклассе, super о в shipment вызывает конструктор класса Boxweight. super о в Boxweight вызывает конструктор класса box. В иерархии классов, если конструктор суперкласса требует наличие параметров, то все подклассы должны передать эти параметры "вверх по линии". И это не зависит от того, нуждается ли подкласс в своих собственных параметрах.
В предыдущей программе полная иерархия классов, включающая box, BoxWeight и shipment, показана вся в одном файле. Это только для вашего удобства. В Java все три класса были бы помещены в свои собственные файлы и откомпилированы отдельно. При создании иерархий классов использование отдельных файлов на самом деле — норма, а не исключение.
Когда вызываются конструкторы
Когда иерархия классов создана, в каком порядке вызываются конструкторы классов, образующих иерархию? Например, если имеется подкласс в и суперкласс а, д-конструктор вызывается перед в-конструкторами, или наоборот? Ответ заключается в том, что в иерархии классов конструкторы вызываются в порядке подчиненности классов — от суперкласса к подклассу. Далее, так как super о должен быть первым оператором, выполняемым в конструкторе подкласса, этот порядок всегда одинаков и не зависит от того, используется ли super (). Если -super о не используется, то-сначала'.будет выполнен конструктор по умолчанию (без параметров) каждого суперкласса. Следующая программа иллюстрирует, когда выполняются конструкторы: