
- •Глава 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
154 Часть I. Язык Java
разрушения объекта эти ресурсы освобождаются. Для обработки таких ситуаций Java использует механизм, называемый завершением (finalization). Применяя завершение, можно определять специальные действия, которые будут выполняться примерно тогда, когда объект будет использоваться сборщиком мусора.
Чтобы добавить завершение к классу, вы просто определяете метод finalize о. Исполняющая система Java вызывает этот метод всякий раз, когда она собирается ликвидировать объект данного класса. Внутри метода finalize о нужно определить те действия, которые должны быть выполнены прежде, чем объект будет разрушен. Сборщик мусора, отрабатывает периодически, проверяя объекты, на которые нет больше ссылок ни из выполняющихся процессов, ни косвенных — из других действующих объектов. Непосредственно перед освобождением всех активов исполняющая система Java вызывает для объекта метод finalize ().
Метод finalize о имеет следующую общую форму:
protected void finalize()
{
// код завершения
}
Здесь ключевое слово protected — спецификатор, который запрещает доступ к finalize о кодам, определенным вне этого класса. Объяснение этого и других спецификаторов приводится в главе 7.
Важно понять, что finalize о вызывается только перед самой сборкой "мусора". Он не запускается, когда объект выходит из области действия идентификаторов, например. Это означает, что вы не сможете определить, когда finalized будет выполнен (и даже будет ли он выполнен вообще). Поэтому ваша программа должна обеспечить другие средства освобождения системных ресурсов, используемых объектом. Для нормальной работы программы она не должна полагаться на finalize/).
Если вы знакомы с C++, то знаете, что C++ позволяет определять деструктор для класса, который вызывается, когда объект выходит из области действия идентификаторов. Java не поддерживает этой идеи и не использует деструкторов. Метод finalize () только аппроксимирует функцию деструктора. Когда вы наберетесь больше опыта в Java, то увидите, что потребность в функциях деструктора минимальна из-за наличия в Java подсистемы сборки "мусора".
Класс Stack
Хотя класс box полезен для иллюстрации существенных элементов класса, он имеет небольшое практическое значение. Чтобы показать действителъ-
Глава 6. Введение в классы 155
ную мощь классов, данную главу закончим более сложным примером. Как вы помните из обсуждения объектно-ориентированного программирования (OOP), представленного в главе 2, одним из наиболее важных его преимуществ является инкапсуляция данных и кода, который манипулирует этими данными. Механизмом, с помощью которого достигается инкапсуляция, является класс. Создавая класс, вы организуете новый тип данных, который определяет как характер данных, так и подпрограммы, используемые для манипулирования этими данными. Непротиворечивый и управляемый интерфейс с данными класса определяют методы. Таким образом, вы можете использовать класс через его методы, не беспокоясь о деталях его реализации или о том, как данные фактически управляются внутри класса. В некотором смысле, класс подобен "машине данных". Чтобы использовать машину через ее органы управления, никаких знаний о том, что происходит внутри машины, не требуется. Фактически, поскольку подробности скрыты, ее внутренняя работа может быть изменена так, как это необходимо. Пока ваш код использует класс через его методы, внутренние подробности могут изменяться, не вызывая побочных эффектов вне класса.
Чтобы получить практическое приложение предшествующего обсуждения, давайте разработаем один из типичных примеров инкапсуляции — стек. Стек хранит данные, используя очередь типа LIFO ("Last-In, First-Out") — последним вошел, первым вышел. То есть стек подобен стопке тарелок на столе — последняя тарелка, поставленная на стопку, снимается со стопки первой. Стеки управляются через две операции, традиционно называемые push (поместить) и pop (извлечь, вытолкнуть). Чтобы поместить элемент в вершину стека, нужно использовать операцию push. Чтобы извлечь элемент из стека, нужно использовать операцию pop. Заметим, что инкапсуляция полного механизма стека — довольно простая задача.
В следующей программе класс с именем stack реализует стек целых чисел:
// Этот класс определяет целый стек для хранения 10 значений. class Stack {
int stck[] = new int[10];
int tos;
// инициализировать вершину стека Stack () {
tos = -1; }
// поместить элемент в стек, void push(int item) {
if (tos=9)
System.out.println("Стек заполнен.");
else
/56 Часть I. Язык Java
stck[++tos] = item; }
// Извлечь элемент из стека int pop() { ifttos < 0) {
System.out.println("Стек пуст.") , return 0; } else
return stck[tos—]; } }
Нетрудно видеть, что класс stack определяет два элемента данных и три метода. Стек целых чисел содержится в массиве stck. Этот массив индексирован переменной tos, которая всегда содержит индекс вершины стека. Конструктор stack о инициализирует tos значением — 1, которое указывает, что стек пуст. Метод push ( ) помещает элемент в стек. Чтобы извлечь элемент, вызовите метод pop ( ) . Так как доступ к стеку выполняется через push ( ) и pop о, тот факт, что стек содержится в массиве, не мешает использованию стека. Например, стек мог бы храниться в более сложной структуре данных, скажем, типа связного списка, а интерфейс, определенный методами push о и pop ( ) , остался бы тем же самым.
Показанный ниже класс Teststack, демонстрирует работу с классом stack. Он создает два целочисленных стека, помещает некоторые значения в каждый и затем выталкивает их.
class TestStack { -
public static void main(String args [] ) { Stack mystackl = new Stack (); Stack mystack2 = new Stack ();
// поместить несколько чисел в стек for(int i=0; i<10; i++) mystackl. push (i) ; forfint i=10; i<20; i++) mystack2.push (i) ;
// вытолкнуть эти числа из стека System.out.println("Стек в mystackl:"}, for(int 1=0; i<10; i++)
System.out.println(mystackl.pop()};
System.out.println("Стек в mystack2:"), for(int 1=0; i<10; i++)
System.out.println(mystack2.pop()); } }