- •ПРЕДИСЛОВИЕ
- •Об этой книге
- •Примеры и документация
- •Глава 1 ПЕРВОЕ ЗНАКОМСТВО С JAVA
- •1.4.1.Символы Unicode
- •1.9.Строковые объекты
- •1.10.1.Класс Object
- •1.14.Инфраструктура Java
- •Глава 2 КЛАССЫ И ОБЪЕКТЫ
- •2.1.Простой класс
- •2.7.Ссылка this
- •2.10.1.Метод finalize
- •2.11.Метод main
- •Глава 3 РАСШИРЕНИЕ КЛАССОВ
- •3.6.Класс Object
- •Глава 4 ИНТЕРФЕЙСЫ
- •4.2. Одиночное и множественное наследование
- •4.6. Для чего применяются интерфейсы
- •Глава 5 ЛЕКСЕМЫ, ОПЕРАТОРЫ И ВЫРАЖЕНИЯ
- •5.1.Набор символов
- •5.20. Операторы присваивания
- •Глава 6 ПОРЯДОК ВЫПОЛНЕНИЯ
- •6.3.Оператор switch
- •6.5.Оператор for
- •6.7.Оператор break
- •6.8.Оператор continue
- •6.9.Оператор return
- •Глава 7 ИСКЛЮЧЕНИЯ
- •7.3.Условие throws
- •7.4.1.Условие finally
- •Глава 8 СТРОКИ
- •8.8.Класс StringBuffer
- •Глава 9 ПОТОКИ
- •9.2.1.Методы synchronized
- •9.2.2.Операторы synchronized
- •9.8.Прерывание потока
- •9.11.Использование Runnable
- •Глава 10 ПАКЕТЫ
- •Глава 11 ПАКЕТ ВВОДА/ВЫВОДА
- •11.2.Класс InputStream
- •11.3.Класс OutputStream
- •11.6.Класс PrintStream
- •11.9.Класс StringBufferInputStream
- •11.12.Класс SequenceInputStream
- •11.13.Класс LineNumberInputStream
- •11.14.Класс PushbackInputStream
- •11.15.Класс StreamTokenizer
- •11.17.Класс RandomAccessFile
- •11.18.Класс File
- •11.19.Интерфейс FilenameFilter
- •Глава 12 СТАНДАРТНЫЕ ВСПОМОГАТЕЛЬНЫЕ СРЕДСТВА
- •12.1.Класс BitSet
- •12.2.Интерфейс Enumeration
- •12.4.Класс Vector
- •12.5.Класс Stack
- •12.6.Класс Dictionary
- •12.7.Класс Hashtable
- •12.8.Класс Properties
- •12.9.Классы Observer/Observable
- •12.10.Класс Date
- •12.11.Класс Random
- •13.1.Класс Class
- •13.4.Класс Boolean
- •13.5.Класс Character
- •13.6.Класс Number
- •13.7.Класс Integer
- •13.8.Класс Long
- •Глава 14 СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
- •14.5.Класс Runtime
- •14.8.Класс Math
- •Приложение А Родные методы
- •А.1 Обзор
- •А.2 Согласование с C и C++
- •А.2.1 Имена
- •А.2.2 Методы
- •А.2.3 Типы
- •А.2.5 Средства безопасности
- •А.2.6 Работа с памятью
- •А.3 Пример
- •А.3.1 Внутреннее строение LockableFile
- •А.4 Строки
- •А.5 Массивы
- •А.6 Создание объектов
- •А.7 Вызов методов Java
- •А.8 Последнее предупреждение
- •Приложение В Полезные таблицы
- •Таблица 3. Приоритет операторов
converted to PDF by BoJIoc
придется включить в класс поле типа AttributedImpl, используемое при перенаправлении вызовов, и инициализировать его ссылкой на объект AttributedImpl.
Перенаправление работает без особых хитростей и требует существенно меньших усилий, чем реализация Attributed “с нуля”. Кроме того, если в будущем появится более удачная реализация Attributed, вы сможете быстро перейти на нее.
4.6. Для чего применяются интерфейсы
Между интерфейсами и абстрактными классами существует два важных отличия:
∙Интерфейсы предоставляют некоторую разновидность множественного наследования, поскольку класс может реализовать несколько интерфейсов. С другой стороны, класс расширяет всего один класс, а не два или более, даже если все они состоят только из абстрактных методов.
∙Абстрактный класс может содержать частичную реализацию, защищенные компоненты, статические методы и т. д., тогда как интерфейс ограничивается открытыми методами, для которых не задается реализация, и константами.
Эти отличия обычно определяют выбор средства, которое должно применяться для конкретного случая. Если вам необходимо воспользоваться множественным наследованием, применяются интерфейсы. Однако при работе с абстрактным классом вместо перенаправления методов можно частично или полностью задать их реализацию, чтобы облегчить наследование. Перенаправление — довольно скучная процедура, к тому же чреватая ошибками, так что вам стоит лишний раз подумать, прежде чем отказываться от абстрактных методов.
Тем не менее любой сколько-нибудь важный класс (абстрактный или нет), предназначенный для расширения, должен представлять собой реализацию интерфейса. Хотя для этого потребуется немного дополнительных усилий, перед вами открывается целый спектр новых возможностей, недоступных в других случаях. Например, если бы мы просто создали класс Attributed вместо интерфейса Attributed, реализованного в специальном классе AttributedImpl, то тогда на его основе стало бы невозможно построить другие полезные классы типа AttributedBody — ведь расширять можно всего один класс. Поскольку Attributed является интерфейсом, у программистов появляется выбор: они могут либо непосредственно расширить AttributedImpl и избежать перенаправления, либо, если расширение невозможно, по крайней мере воспользоваться перенаправлением для реализации интерфейса. Если общая реализация окажется неверной, они напишут свою собственную. Вы даже можете предоставить несколько реализаций интерфейса для разных категорий пользователей. Независимо от того, какую стратегию реализации выберет программист, создаваемые объекты будут Attributed.
Упражнение 4.1
Перепишите свое решение упражнения 3.7 с использованием интерфейса, если вы не сделали этого ранее.
Упражнение 4.2
Перепишите свое решение упражнения 3.12 с использованием интерфейса, если вы не сделали этого ранее.
Упражнение 4.3
Должен ли класс LinkedList из предыдущих упражнений представлять собой интерфейс? Прежде чем отвечать на этот вопрос, перепишите его с использованием реализующего класса.
Упражнение 4.4