
- •ОГЛАВЛЕНИЕ
- •ВВЕДЕНИЕ
- •ГЛАВА 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 Абстрактный класс или интерфейс?
- •СПИСОК СОКРАЩЕНИЙ
- •СПИСОК ЛИТЕРАТУРЫ
import attr.Attributed;
Процедура импортирования кода, принадлежащего текущему пакету, выполняется неявно, поэтому любые типы пакета допускают непосредственное обращение из кода других типов, объявленных в том же пакете.
Также существует один пакет, который всегда импортируется по умолчанию: java.lang. В данном пакете содержатся типы, лежащие в основе языка.
Важно понимать суть механизма импортирования в Java: единственное, что он позволяет делать – это использовать простые имена вместо полных, при этом не происходит никакого копирования исходного кода или байт-кода. Но компилятор, при обнаружении в тексте программы простого имени, которое не может быть найдено в текущем пакете, просмотрит предложения об импортировании в поисках импортированного типа с совпадающим простым именем, или импортированного пакета, вкотором есть тип ссовпадающимпростымименем.
1.8 Понятие имени
Имена задаются посредством идентификаторов и указывают на элементы программы (типы, переменные, поля, методы и т.д.). Идентификатор является последовательностью цифр и букв (а с учётом ориентированности Java на Unicode – достаточно разнообразных букв), не может включать в себя символы-разделители (например, точку) и не может начинаться с цифры.
Задача управления именами элементов программы решается посредством двух механизмов. Во-первых, для элементов различных видов рассматриваются различные пространства имён (namespace). Во-вторых, имена, видимые в одной части программы, «скрываются» от других посредством соответствующих контекстов. Так, например, разделение пространств имён позволяет использовать один и тот же идентификатор для поля и метода класса, а средства контекстного
24
сокрытия дают возможность пользоваться одним идентификатором для обозначения переменных-счётчиков всех циклов for.
Существует шесть различных пространств имён:
•пакеты,
•типы,
•поля,
•методы,
•локальные переменные и параметры,
•метки.
Разделение пространств имён обеспечивает гибкие возможности
написания программ, но при неразумном использовании оно способен доставить и серьёзные неприятности (см. пример 3).
Пример 3. Душераздирающий, но синтаксически правильный код package Reuse;
class Reuse {
Reuse Reuse (Reuse Reuse) { Reuse:
for(;;) {
if (Reuse.Reuse(Reuse)== Reuse) break Reuse;
}
return Reuse;
}
}
Каждое объявление имени определяет контекст, в котором имя может использоваться. Например, контекстом параметра метода служит блок тела этого метода; контекст локальной переменной определяется границами блока, в котором она определена; контекст переменной цикла, объявленной в секции инициализации заголовка цикла for, распространяется на блок тела цикла.
25
Имя нельзя использовать за пределами его контекста – например, один метод класса не способен обращаться к параметрам другого метода. Контексты, однако, могут быть вложенными, и код внутреннего контекста обладает правами доступа ко всем именам внешнего контекста. Например, разрешено обращаться из тела цикла for к локальным переменным, объявленным в пределах того же метода, где находится и цикл for.
Подразумевается, что имена, объявленные во внешних контекстах, в некоторых случаях могут быть скрыты именами, принадлежащими внутренним контекстам. Например, имена полей класса способны перекрываться именами локальных переменных, унаследованные поля класса – полями, объявленными в текущем классе.
Не разрешается перекрывать имена во вложенных контекстах внутри одного блока кода. Это означает, что локальная переменная в теле метода не может обладать тем же именем, что и параметр метода; переменную цикла for не разрешается обозначать именем, которое принадлежит локальной переменной или параметру; во вложенном блоке нельзя повторно использовать имена, объявленные во внешнем блоке (см. пример 4).
Пример 4. Неверное объявление переменных во вложенных контекстах
{
int a = 0;
{
int a = 2; // неверно, переменная уже объявлена
// …
}
}
Впрочем, ничто не запрещает создавать в пределах блока различные (невложенные) циклы for или применять невложенные блоки с объявлениями одноимённых переменных.
26
Кроме того, в Java существуют общепринятые правила именования (они являются частью общепринятых правил по оформлению кода). Следование этим правилам, с одной стороны, не проверяется компилятором, но, с другой стороны, следование им облегчит работу с текстом программы и вам, и другим программистам.
Пакеты всегда именуются только маленькими буквами. Пакеты, имена которых начинаются с java, являются стандартными пакетами языка (например java.lang, java.util). Пакеты, имена которых начинаются с javax, являются дополнительными пакетами, вошедшими в стандарт языка (например, javax.swing, javax.xml). Прочие пакеты, разрабатываемые компаниями и сообществами, принято именовать в соответствии с названием сайта разработчика. Так, если пакет dom разработан консорциумом W3C, имеющим сайт www.w3c.org, то именем пакета должно быть org.w3c.dom.
Типы именуются с большой буквы, новые слова обозначаются написанием с большой буквы, разделители не используются. Имя типа должно быть говорящим, аббревиатуры обычно используют, только если они общеизвестные. Для классов имена обычно обозначают категорию объектов (например, Student,
ArrayIndexOutOfBoundException), а для интерфейсов – либо категорию, либо способность к чему-либо (например, Runnable).
Поля именуются с маленькой буквы, новые слова обозначаются написанием с большой буквы, разделители не используются
(например, value, enabled, distanceFromShop).
Методы именуются с маленькой буквы, новые слова обозначаются написанием с большой буквы, разделители не используются (например, calculate, toString, concat). Если метод предназначен только для получения некоторого значения, то его имя должно начинаться со слова get (например, getHeight) или со слова is, если значение булево (например, isVisible).
27