
- •Глава 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
Глава 7. Методы и классы . 161
Эта версия overioadDemo не определяет test(int) с одним целым параметром. Поэтому, когда test о вызывается с целым аргументом внутри класса overload, никакого согласованного метода не находится. Однако Java может автоматически преобразовывать int в double, и это преобразование можно использовать для разрешения вызова. Поэтому, после того, как test (int) не находится, Java расширяет i до double и затем вызывает test (double). Конечно, если бы test (int) был определен, то он вызывался бы вместо test (double). Java использует эти автоматические преобразования типов только тогда, когда никакого точного соответствия не находится.
Перегрузка методов поддерживает полиморфизм, потому что это один из способов, с помощью которых Java реализует парадигму "один интерфейс, множество методов". Чтобы понять, как это делается, приведем следующие рассуждения. На языках, которые не поддерживают перегрузку методов, каждому методу необходимо давать уникальное имя. Однако часто нужно реализовать, по существу, один и тот же метод для различных типов данных. Рассмотрим функцию абсолютного значения. На языках, которые не поддерживают перегрузку, существует обычно три или более версий этой функции, каждая со слегка отличающимся именем. Например, в С, функция abs () возвращает абсолютное значение целого числа, labs () возвращает абсолютное значение длинного целого числа, a fabs () — абсолютное значение числа с плавающей точкой. Так как С не поддерживает перегрузку, каждая функция должна иметь свое собственное имя, даже при том, что все три функции выполняют, по существу, одно и то же. Это делает ситуацию более сложной, чем она фактически есть на самом деле. Хотя основная концепция каждой функции одна и та же, вам все еще нужно помнить три разных имени. Подобная ситуация отсутствует в Java, потому что метод получения абсолютного значения един для всех типов данных. Действительно, библиотека стандартных классов Java включает метод абсолютного значения, с именем abs (). Этот метод перегружен в Math-классе Java, чтобы обрабатывать все числовые типы. Java определяет, какую версию abs о вызывать, основываясь на типе аргумента. Значение перегрузки заключается в том, что она позволяет осуществлять доступ к связанным методам при помощи общего имени. Таким образом, имя abs представляет общее выполняемое действие. Право же выбирать правильную специфическую версию для конкретного обстоятельства предоставлено компилятору. Вы же, как программист, должны только помнить общую выполняемую операцию. При использовании полиморфизма несколько имен были сокращены до одного. Хотя этот пример довольно прост, но если расширить концепцию, то можно увидеть, как перегрузка может помочь вам управлять большей сложностью.
Когда вы перегружаете метод, каждая версия этого метода может выполнять любое действие, какое вы пожелаете. Нет никакого правила, заявляющего, как перегруженные методы должны быть связаны друг с другом. Однако, со стилистической точки зрения, перегрузка метода подразумевает некоторую их взаимосвязь. Таким образом, хотя можно использовать то же самое имя,
•JQ2 Часть I, Язык Java
чтобы перезагрузить несвязанные методы, но этого делать не нужно. Например, можно использовать имя sqr, чтобы создать методы, возвращающие квадрат целого числа и квадратный корень числа с плавающей точкой. Но эти две операции совершенно различны. Такой способ применения перегрузки метода противоречит его первоначальной цели. Практически, следует перегружать только тесно связанные операции.
Перегрузка конструкторов
В дополнение к перегрузке обычных методов можно также перезагружать методы конструкторов. Фактически, для наиболее реальных классов, которые вы создаете, перезагруженные конструкторы будут нормой, а не исключением. Для объяснения этого утверждения вернемся к классу box, разработанному в предыдущей главе. Самая последняя версия box выглядит так:
class Box { double width; double height; double depth;
// Это конструктор класса Box.
Box(double w, double h, double d) {
width = w;
height = h;
depth = d; }
// вычислить и возвратить объем double volume() {
return width * height * depth; } }
Здесь конструктор box { ) имеет три параметра. Это означает, что все объявления Box-объектов должны переслать в конструктор box ( ) три аргумента. Например, следующий оператор недопустим:
Box ob = new Box ( ) ;
Так как box ( ) требует трех параметров, то его вызов без них — это ошибка. Это поднимает несколько важных вопросов. Что, если вы просто хотели построить трехмерный блок и не заботились (или не знали), каковы были его начальные размеры? Или, что, если вы хотите инициализировать куб, определяя только одно значение, которое использовалось бы для всех трех размеров? В предложенной выше форме записи класса box эти возможности вам недоступны.
К счастью, решается проблема совсем просто: перегрузите конструктор box так, чтобы он обрабатывал только что описанные ситуации. Ниже показана