
- •ОГЛАВЛЕНИЕ
- •ВВЕДЕНИЕ
- •ГЛАВА 1. ПРИНЦИПЫ ООП. КЛАССЫ И ОБЪЕКТЫ
- •1.1 Основные принципы ООП
- •1.2 Достоинства ООП
- •1.3 Недостатки ООП
- •1.4 Классы и объекты
- •1.5 Члены класса
- •1.6 Модификаторы объявления класса
- •1.7 Пакеты
- •1.8 Понятие имени
- •1.9 Понятие модуля компиляции
- •1.10 Поля
- •1.11 Управление доступом
- •1.12 Создание объектов
- •1.13 Конструкторы
- •1.14 Блоки инициализации
- •1.15 Статическая инициализация
- •1.16 Методы
- •1.16.1 Модификаторы методов
- •1.16.2 Статические методы
- •1.16.3 Вызов метода
- •1.16.4 Выполнение метода и возврат из него
- •1.16.5 Параметры метода
- •1.16.6 Применение методов для управления доступом
- •1.16.7 Ключевое слово this
- •1.16.8 Перегруженные методы
- •1.16.9 Метод main
- •1.16.10 Методы native
- •ГЛАВА 2. ОСНОВЫ ЛЕКСИКИ
- •2.1 Комментарии
- •2.2 Служебные слова
- •2.3 Идентификаторы
- •2.4 Литералы
- •2.4.1 Целочисленные литералы
- •2.4.2 Литералы с плавающей точкой
- •2.4.3 Логические литералы
- •2.4.4 Символьные литералы
- •2.4.5 Строковые литералы
- •2.5 Операторы
- •2.6 Разделители
- •2.7 Переменные
- •2.8 Простые типы
- •2.8.1 Целочисленные типы
- •byte
- •short
- •long
- •2.8.2 Числовые типы с плавающей точкой
- •float
- •double
- •2.8.3 Приведение типа
- •2.8.4 Автоматическое преобразование типов в выражениях
- •2.8.5 Символьный тип
- •2.8.6 Логический тип
- •2.9 Массивы
- •2.9.1 Многомерные массивы
- •2.9.2 Инициализация массивов
- •2.10 Операторы
- •2.10.1 Арифметические операторы
- •Операторы арифметических действий
- •Оператор деления по модулю
- •Операторы арифметических действий с присваиванием
- •Целочисленная арифметика
- •Арифметика с плавающей запятой
- •2.10.2 Инкремент и декремент
- •2.10.3 Целочисленные битовые операторы
- •Операторы битовой арифметики
- •Оператор побитового сдвига влево
- •Операторы побитового сдвига вправо
- •Операторы битовой арифметики с присваиванием
- •2.10.4 Операторы сравнения
- •2.10.5 Логические операторы
- •2.10.6 Оператор проверки соответствия типа
- •2.10.7 Условный тернарный оператор
- •2.10.8 Приоритеты операторов
- •2.11 Управление выполнением метода
- •2.11.1 Завершение работы метода
- •2.11.2 Ветвление
- •2.11.3 Циклы
- •while
- •do-while
- •2.11.4 Прерывание блоков инструкций
- •2.11.5 Переход на следующий виток цикла
- •2.11.6 Блок переключателей
- •ГЛАВА 3. ИСКЛЮЧЕНИЯ
- •3.1 Общие сведения об исключениях
- •3.2 Инструкция throw
- •3.3 Предложения throws
- •3.4 Предложения throws и переопределение методов
- •3.5 Предложения throws и методы native
- •3.6 Блок try-catch-finally
- •ГЛАВА 4. НАСЛЕДОВАНИЕ
- •4.1 Расширенный класс. Конструкторы расширенных классов
- •4.2 Порядок выполнения конструкторов
- •4.3 Переопределение методов при наследовании
- •4.4 Сокрытие полей
- •4.5 Доступ к унаследованным членам класса
- •4.6 Возможность доступа и переопределение
- •4.7 Сокрытие статических членов
- •4.8 Служебное слово super
- •4.9 Совместимость и преобразование типов
- •4.9.1 Совместимость
- •4.9.2 Явное преобразование типов
- •4.10 Проверка типа
- •4.11 Завершённые методы и классы
- •4.12 Абстрактные методы и классы
- •4.13 Класс Object
- •4.13.1 Метод сравнения объектов
- •4.13.2 Метод вычисления хеш-кода
- •4.13.3 Метод клонирования объектов
- •4.13.4 Метод получения ссылки на описание класса
- •4.13.5 Метод завершения работы объекта
- •4.13.6 Метод получения строкового представления
- •ГЛАВА 5. ИНТЕРФЕЙСЫ
- •5.1 Пример простого интерфейса
- •5.2 Объявление интерфейса
- •5.3 Константы в интерфейсах
- •5.4 Методы в интерфейсах
- •5.5 Модификаторы в объявлениях интерфейсов
- •5.6 Расширение интерфейсов
- •5.7 Наследование и сокрытие констант
- •5.8 Наследование, переопределение и перегрузка методов
- •5.9 Пустые интерфейсы
- •5.10 Абстрактный класс или интерфейс?
- •СПИСОК СОКРАЩЕНИЙ
- •СПИСОК ЛИТЕРАТУРЫ
или инкрементировать значение символьной переменной. В приведенном ниже фрагменте кода мы, располагая базовым символом, прибавляем к нему целое число, чтобы получить символьное представление нужной нам цифры.
Пример 29. Арифметические действия с символьными значениями int three = 3;
char one = '1';
char four = (char) (three + one);
Врезультате выполнения этого кода в переменную four заносится символьное представление нужной нам цифры – '4'. Обратите внимание: тип переменной one в приведенном выше выражении повышается до типа int, так что перед занесением результата в переменную four приходится использовать оператор явного приведения типа.
2.8.6Логический тип
Вязыке Java есть простой тип boolean, используемый для хранения логических значений. Переменные этого типа могут принимать всего два значения – true (истина) и false (ложь). Значения типа boolean возвращаются в качестве результата всеми операторами сравнения, например (а < b). Кроме того, boolean – это тип, требуемый всеми условными инструкциями, такими как if,
while, do.
boolean done = false;
2.9 Массивы
Массивы (arrays) – это упорядоченные наборы элементов одного типа. Элементами массива могут служить значения как простых, так и ссылочных типов. В последнем случае элементами массива будут
77
именно ссылки, в том числе и ссылки на другие массивы: массивы сами по себе являются объектами и наследуют от класса Object.
Объявление
int[] ia = new int[3];
создаёт ссылочную переменную с именем ia типа int[], соответствующего массиву значений типа int, и помещает в неё ссылку на созданный объект массива из трёх элементов типа int.
В объявлении ссылочной переменной типа массива размерность не указывается. В свою очередь количество элементов объекта массива задаётся при его создании посредством оператора new. Длина массива фиксируется в момент создания и в дальнейшем изменению не поддаётся. Впрочем, ссылочной переменной типа массива в любой момент может быть поставлен в соответствие другой массив того же типа с другой размерностью.
Доступ к элементам массива осуществляется по значениям их номеров-индексов. Если длина массива length, то первый элемент массива имеет индекс равный 0, а последний – length-1. Длину массива можно определить с помощью поля length объекта массива (которое неявно снабжено признаками public и final).
Обращение к элементу массива выполняется путём применения к ссылке на массив оператора доступа к элементу массива (квадратных скобок с заключённым в них выражением, результат которого трактуется как индекс в массиве). Чаще всего ссылка на массив задаётся путём указания имени переменной:
ia[10]
Однако ссылка может быть получена и другим образом. Например, если метод toArray() имеет возвращаемый тип Object[] (т.е. ссылка на массив ссылок на произвольные объекты), а index – целочисленная переменная, то возможна следующая конструкция:
toArray()[index + 5]
78
При каждом обращении к элементу массива по индексу исполняющая система Java проверяет, находится ли значение индекса в допустимых пределах, и генерирует исключение типа
ArrayIndexOutOfBoudsException, если результат проверки ложен. Выражение индекса должно относиться к типу int – только этим и ограничивается максимальное количество элементов массива.
Ниже приведён пример кода, в котором в цикле выводится на экран содержимое каждого элемента массива ia:
Пример 29. Вывод элементов массива в консоль for (int i = 0; i < ia.length; i++)
System.out.println(i+ ": " + ia[i]);
Массив нулевой длины (т.е. такой, в котором нет элементов) принято называть пустым. Обратите внимание, что ссылка на массив, равная значению null, и ссылка на пустой массив – это совершенно разные вещи. Пустой массив – это реальный массив, в котором попросту отсутствуют элементы. Пустой массив представляет собой удобную альтернативу значению null при возврате из метода. Если метод способен возвращать null, прикладной код, в котором выполняется обращение к методу, должен сравнить возвращённое значение с null прежде, чем перейти к выполнению оставшихся операций. Если же метод возвращает массив (возможно, пустой), никакие дополнительные проверки не нужны – разумеется, помимо тех, которые касаются длины массива и должны выполняться в любом случае.
Допускается и иная форма объявления ссылок на массивы, в которой квадратныескобки ставятсяпосле идентификатора массива:
int ia[] = new int[3];
Первый вариант синтаксиса считается более предпочтительным, поскольку формально типом переменной является именно int[].
Правила употребления в объявлениях массивов тех или иных модификаторов обычны. Существует единственная особенность,
79
которую важно помнить: модификаторы применяются к ссылочной переменной, а не к массиву как таковому. Если в объявлении указан признак final, это значит только то, что ссылка на массив не может быть изменена, но это никак не запрещает изменять содержимого элементов массива. В Java нельзя указать никакие модификаторы (скажем, final или volatile) для элементов массива.
2.9.1Многомерные массивы
ВJava поддерживается возможность объявления т.н. многомерных массивов (multidimensional arrays), т.е. массивов, элементами которых служат другие массивы. Код, предусматривающий объявление двумерной матрицы и вывод на экран содержимого её элементов, может выглядеть, например, так, как показано в примере 30.
Пример 30. Создание и работа с двумерным массивом float[][] mat = new float[4][4];
for (int y = 0; y < mat.length; y++) {
for (int x = 0; x < mat[y].length; x++) System.out.print(mat[y][x] + " ");
System.out.println();
}
Типом ссылки в приведённом примере является float[][]. С одной стороны, количество пар скобок означает размерность массива. С другой стороны, пара квадратных скобок означает, что ссылка имеет тип массива, а тип его элементов указан слева от квадратных скобок. Т.о. в нашем примере mat – это, чтобы быть точными, одномерный массив, элементы которого имеют тип float[], т.е. являются ссылками на одномерные массивы с элементами типа float. В свою очередь, конструкция mat[y][x] означает взятие элемента с номером x из массива, получаемого в результате вычисления выражения mat[y], т.е. из элемента с номером y массива mat.
80