Можно ли в объявлениях интерфейсов создать что то кроме методов

27. Java – Интерфейсы

Интерфейс — это ссылочный тип в Java. Он схож с классом. Это совокупность абстрактных методов. Класс реализует интерфейс, таким образом наследуя абстрактные методы интерфейса.

Вместе с абстрактными методами интерфейс в Java может содержать константы, обычные методы, статические методы и вложенные типы. Тела методов существуют только для обычных методов и статических методов.

Далее разберём зачем нужны интерфейсы в Java и для чего используются, разницу абстрактного класса и интерфейса.

Содержание

Написание интерфейса схоже с написанием класса. Но класс описывает атрибуты и поведения объекта. И интерфейс содержит поведения, которые класс реализует.

Если класс, реализующий интерфейс, не является абстрактным, все методы интерфейса должны быть определены в классе.

Чем похожи класс и интерфейс?

Интерфейс схож с классом следующим образом:

Чем отличается класс от интерфейса?

Однако, интерфейс всё же отличается от класса. Отличие интерфейса от класса в Java:

Объявление интерфейсов

Ключевое слово interface используется для объявления интерфейса. Вот пример того, как можно создать интерфейс:

Пример 1

Интерфейсы имеют следующие свойства:

Пример 2

Реализация интерфейса

Когда класс реализует интерфейс, вы можете представить себе, что класс словно подписывает контракт с интерфейсом, соглашаясь совершить конкретные его поведения. Если класс не исполняет все поведения интерфейса, то класс должен объявить себя абстрактным.

Класс использует ключевое слово implements для реализации интерфейса. Ключевое слово implements появляется при объявлении класса в его расширенной части.

Пример

При переопределении методов в интерфейсе, нужно следовать некоторым правилам:

При реализации интерфейсов есть некоторые правила:

Расширение интерфейсов

Интерфейс может расширять другой интерфейс так же, как класс другой класс. Ключевое слово extends используется для расширения интерфейса, и дочерний интерфейс наследует методы родительского интерфейса.

Приведённый интерфейс Sports расширен интерфейсами Hockey и Football.

Пример

Интерфейс Hockey имеет четыре метода, но он наследует два из Sports; таким образом, класс, который реализует Hockey, должен реализовать все шесть методов. Подобно этому, класс, который реализует Football, должен определить три метода из Football и два метода из Sports.

Расширение множества интерфейсов

Класс в Java может расширить только один родительский класс. Множественное наследование невозможно. Однако интерфейсы не классы, и интерфейс может расширить более чем один родительский интерфейс.

Ключевое слово extends используется лишь раз, а родительские интерфейсы объявляются через запятую.

Например, если интерфейс Hockey расширил и Sports, и Event, то объявление выглядело бы так:

Интерфейсы тегов

Самое распространённое использование расширения интерфейсов происходит тогда, когда родительский интерфейс не содержит каких-либо методов. Например, интерфейс MouseListener в пакете java.awt.event расширил java.util.EventListener, который определяется так:

Интерфейс без методов в нём называется интерфейсом тегов. Есть две простые дизайнерские цели для интерфейсов тегов:

Создаёт общего родителя – как в случае с интерфейсом EventListener, который расширяется множеством других в Java API, вы можете использовать интерфейс тегов, чтобы создать общего родителя среди группы интерфейсов. Например, когда интерфейс расширяет EventListener, то JVM знает, что этот конкретный интерфейс будет использоваться в сценарии делегирования событий.

Добавляет тип данных в класс – эта ситуация является источником термина «тегирование». Класс, который реализует интерфейс тегов, не должен определять какие-либо методы (т.к. интерфейс не имеет таковых), но класс становится типом интерфейса через полиморфизм.

Источник

Можно ли в объявлениях интерфейсов создать что то кроме методов

metanit java

Механизм наследования очень удобен, но он имеет свои ограничения. В частности мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.

В языке Java подобную проблему частично позволяют решить интерфейсы. Интерфейсы определяют некоторый функционал, не имеющий конкретной реализации, который затем реализуют классы, применяющие эти интерфейсы. И один класс может применить множество интерфейсов.

Данный интерфейс называется Printable. Интерфейс может определять константы и методы, которые могут иметь, а могут и не иметь реализации. Методы без реализации похожи на абстрактные методы абстрактных классов. Так, в данном случае объявлен один метод, который не имеет реализации.

Чтобы класс применил интерфейс, надо использовать ключевое слово implements :

В тоже время мы не можем напрямую создавать объекты интерфейсов, поэтому следующий код не будет работать:

Одним из преимуществ использования интерфейсов является то, что они позволяют добавить в приложение гибкости. Например, в дополнение к классу Book определим еще один класс, который будет реализовывать интерфейс Printable:

Класс Book и класс Journal связаны тем, что они реализуют интерфейс Printable. Поэтому мы динамически в программе можем создавать объекты Printable как экземпляры обоих классов:

Интерфейсы в преобразованиях типов

Все сказанное в отношении преобразования типов характерно и для интерфейсов. Например, так как класс Journal реализует интерфейс Printable, то переменная типа Printable может хранить ссылку на объект типа Journal:

И если мы хотим обратиться к методам класса Journal, которые определены не в интерфейсе Printable, а в самом классе Journal, то нам надо явным образом выполнить преобразование типов: ((Journal)p).getName();

Методы по умолчанию

Статические методы

Чтобы обратиться к статическому методу интерфейса также, как и в случае с классами, пишут название интерфейса и метод:

Приватные методы

Подобные методы могут использоваться только внутри самого интерфейса, в котором они определены. То есть к примеру нам надо выполнять в интерфейсе некоторые повторяющиеся действия, и в этом случае такие действия можно выделить в приватные методы:

Константы в интерфейсах

Кроме методов в интерфейсах могут быть определены статические константы:

Множественная реализация интерфейсов

Если нам надо применить в классе несколько интерфейсов, то они все перечисляются через запятую после слова implements:

Наследование интерфейсов

Интерфейсы, как и классы, могут наследоваться:

При применении этого интерфейса класс Book должен будет реализовать как методы интерфейса BookPrintable, так и методы базового интерфейса Printable.

Вложенные интерфейсы

Как и классы, интерфейсы могут быть вложенными, то есть могут быть определены в классах или других интерфейсах. Например:

При применении такого интерфейса нам надо указывать его полное имя вместе с именем класса:

Использование интерфейса будет аналогично предыдущим случаям:

Интерфейсы как параметры и результаты методов

И также как и в случае с классами, интерфейсы могут использоваться в качестве типа параметров метода или в качестве возвращаемого типа:

Метод read() в качестве параметра принимает объект интерфейса Printable, поэтому в этот метод мы можем передать как объект Book, так и объект Journal.

Метод createPrintable() возвращает объект Printable, поэтому также мы можем возвратить как объект Book, так и Journal.

Источник

BestProg

Перед изучением данной темы рекомендуется изучить тему:

Содержание

Поиск на других ресурсах:

1. Для чего используются интерфейсы? Преимущества применения интерфейсов

Интерфейсы используются для создания полностью абстрактных, классов которые вообще не содержат реализации. Интерфейсы не содержат реализации. Таким образом, интерфейсы предназначены для описания того, что может быть реализовано классами, которые реализуют эти интерфейсы. Иными словами, интерфейсы указывают классам которые их реализуют, что может быть реализовано, но не как это должно быть реализовано. Интерфейсы описывают форму а не реализацию.

В интерфейсе указываются имена методов, списки аргументов и типы значений, которые возвращаются, но не тела (реализации) этих методов.

Использование интерфейсов дает следующие взаимосвязанные преимущества:

2. Общая форма объявления интерфейса. Ключевое слово interface

Общая форма объявления интерфейса имеет следующий вид:

3. Какая общая форма реализации интерфейса в классе? Ключевое слово implements

Если интерфейс определен, то его можно реализовать в классе. Общая форма реализации интерфейса в классе имеет вид:

4. Что нужно обязательно выполнить (реализовать) в классе, который реализует заданный интерфейс?

Если класс реализует интерфейс, то для данного класса устанавливаются следующие обязательства:

5. Примеры объявление интерфейсов и классов, которые их реализуют

Пример 1. В примере демонстрируется:

Пусть в пределах пакета в файле IMathFunctions.java объявлен интерфейс с именем IMathFunctions как показано ниже

В интерфейсе указываются следующие объявления:

После объявления интерфейса объявляется класс, который должен реализовать методы этого интерфейса. В нашем случае объявляется класс MathFunctions

Использование интерфейса в классе может быть, например, следующим

Реализация интерфейса помещается в файле IStrings.java и имеет следующий вид:

Реализация класса описывается в файле ProcessStrings.java и имеет следующий вид

6. Можно ли создать экземпляр (объект) интерфейса?

Поскольку, интерфейс содержит только объявление без реализации, то создать экземпляр интерфейса запрещено. Однако, ссылку на интерфейс объявить можно. Но при выделении памяти оператором new должен указываться конструктор класса, который реализует данный интерфейс.

7. Во скольких классах может быть реализованн интерфейс?
8. Сколько интерфейсов может реализовать один класс?

Класс может реализовать любое количество интерфейсов. В этом случае имена интерфейсов разделяются запятой. Например, в следующем коде

9. Какой тип доступа обязательно должны иметь методы, объявленные в интерфейсе?
10. Какой тип доступа по умолчанию имеют методы, объявленные в интерфейсе?
11. Как вызвать методы класса с помощью ссылок на интерфейсы?

Последовательность шагов следующая (см. пример с п. 5):

Использование метода method() с учетом интерфейса I может быть следующей:

12. Требования к объявлению переменных в интерфейсах
13. В каких случаях можно применять спецификатор доступа public в объявлении интерфейса?

Спецификатор доступа public можно применять перед именем интерфейса только в случае, когда интерфейс определен в файле, который имеет то же имя. Если имя интерфейса не совпадает с именем файла, то спецификатор public нельзя использовать в объявлении интерфейса.

14. Как добавить объявление интерфейса в Java Eclipse?

В системах, поддерживающих программирование на языке Java, добавление интерфейсов в проект реализовано с помощью специальных команд.

Чтобы добавить интерфейс в некоторый проект в системе программирования Java Eclipse нужно выполнить следующие шаги.

1. Активировать проект, в который нужно добавить интерфейс (рис. 1).

03 01 02 14 01

Рис. 1. Активация проекта с именем Project15 в Java Eclipse

2. Вызвать команду создания интерфейса

03 01 02 14 02

Рис. 2. Команда добавления интерфейса к проекту

В результате откроется окно «New Java Interface» (рисунок 3).

3. В окне «New Java Project» нужно выполнить следующие действия (см. рисунок 3):

03 01 02 14 03

4. После выбора кнопки Finish интерфейс с именем MyInterface будет добавлен к проекту Project15 как показано на рисунке 4.

Источник

Суть интерфейсов

1. Способности

Чтобы лучше понять преимущества интерфейсов и места их использования, нужно поговорить о более абстрактных вещах.

Класс — это, чаще всего модель какого-то конкретного объекта. Интерфейс же больше соответствует не объектам, а их способностям или ролям.

original

Например, такие вещи, как машина, велосипед, мотоцикл и колесо лучше всего представить в виде классов и объектов. А такие их способности, как «могу ездить», «могу перевозить людей», «могу стоять», лучше представить в виде интерфейсов. Вот несколько примеров:

Код Описание
соответствует способности передвигаться
соответствует способности управляться водителем
соответствует способности перевозить грузы
класс Wheel (колесо) обладает способностью передвигаться
класс Car (машина) обладает способностью передвигаться, управляться человеком и перевозить грузы
класс Skateboard (скейтборд) обладает способностью передвигаться и управляться человеком

2. Роли

Интерфейсы сильно упрощают жизнь программиста. Очень часто в программе есть тысячи объектов, сотни классов и всего пара десятков интерфейсов — ролей. Ролей мало, а их комбинаций — классов — очень много.

Весь смысл в том, что вам не нужно писать код для взаимодействия всех классов со всеми. Вам достаточно взаимодействовать с их ролями (интерфейсами).

Представьте, что вы дрессируете домашних животных, каждое из которых может иметь несколько разных способностей. И вы поспорили с соседом, чьи животные громче кричат. Вы просто берете всех, у которых есть способность «голос», и командуйте им: Голос!.

Вам все равно, что это за животные и какие у них есть другие способности. Хоть тройное сальто назад. В этот конкретный момент вас интересует только способность громко орать. Вот как это выглядело бы в коде:

Для удобства мы дали классам имена на русском. Такое допускается в Java, но крайне нежелательно.

Наша Рыбка не обладает способностью говорить (не реализует интерфейс Звучание ). И как дать им команду?

Когда количество классов в ваших программах пойдет на тысячи, вы жить без интерфейсов не сможете. Вместо описания взаимодействия тысяч классов, достаточно описать взаимодействие десятков интерфейсов — это очень сильно упрощает жизнь.

3. default реализация в методах интерфейсов

Абстрактные классы могут иметь переменные и реализацию методов, но для них множественное наследование запрещено. Интерфейсы не могут иметь переменные и реализации методов, и для них множественное наследование разрешено.

Можно эту ситуацию выразить в таблице:

Способность Абстрактные классы Интерфейсы
Переменные
Реализация методов
Множественное наследование

И вот некоторым программистам очень хотелось, чтобы у интерфейсов была возможность иметь реализацию методов. Иметь возможность добавить реализацию метода — это же не значит, что ее всегда обязательно будут добавлять. Хочешь добавляй, хочешь — нет.

К тому же, проблемы с множественным наследованием в первую очередь из-за переменных. В общем, решили и сделали. Начиная с JDK 8, в Java появилась возможность добавлять в интерфейсы методы с реализацией.

Новая актуальная таблица (для JDK 8 и выше):

Способность Абстрактные классы Интерфейсы
Переменные
Реализация методов
Множественное наследование

Теперь и в абстрактных классах, и в интерфейсах можно объявлять как методы с реализацией, так и без нее. И это отличная новость!

Для простоты приведем эту информацию в виде небольшой таблички:

Способность Абстрактные классы Интерфейсы
Методы без реализации abstract
Методы с реализацией default

Проблема

С помощью интерфейсов с методами можно значительно упростить иерархии многих классов. Например, абстрактные классы InputStream и OutputStream можно объявить интерфейсами! Это позволит использовать их гораздо чаще и гораздо удобнее.

Но в мире уже написаны десятки миллионов (миллиарды?) Java-классов. И если начать менять стандартные библиотеки, то есть риск, что что-то может поломаться. Например, всё! 😛

Чтобы случайно не сломать работающие программы и библиотеки, было решено, что реализация методов в интерфейсах получит самый низкий приоритет при наследовании.

Например, если от интерфейса с методом унаследовать второй интерфейс и в нем объявить этот же метод, но без реализации, то реализация из первого метода до класса не дойдет. Пример:

Источник

Интерфейсы в Java

1. Знакомство с интерфейсами

Сегодня у вас прямо день знаний. Еще одна новая и интересная тема — это интерфейсы.

Вот несколько полезных фактов об интерфейсах:

1. Объявление интерфейса

Интерфейс может наследоваться только от интерфейсов. Зато родителей у интерфейса может быть много. Еще говорят, что в Java есть множественное наследование интерфейсов. Примеры:

3. Наследование классов от интерфейсов

Технически между словами extends и implements нет никакой разницы: и то, и то — это наследование. Так было сделано, чтобы повысить читабельность кода. В английском языке принято говорить, что классы наследуются ( extends ), а интерфейсы реализуются ( implements )

4. Переменные

И самое важное: в интерфейсах нельзя объявлять переменные (хотя статические можно).

А зачем же нужны интерфейсы? Когда их используют? У интерфейсов есть два сильных преимущества по сравнению с классами:

2. Отделение «описания методов» от их реализации.

С помощью интерфейсов это деление можно усилить еще больше. Мы сделаем специальный «класс для всех», и второй «класс для своих», который унаследуем от первого. Вот как это примерно будет:

Таким образом, мы скрываем не только различные реализации, но и сам класс, который ее содержит (везде в коде может фигурировать только интерфейс). Это позволяет очень гибко, прямо в процессе исполнения программы, подменять одни объекты на другие, меняя поведение объекта скрытно от всех классов, которые его используют.

Это очень мощная технология в сочетании с полиморфизмом. Сейчас далеко не очевидно, зачем так нужно делать. Вы сначала должны столкнуться с программами, состоящими из десятков или сотен классов, чтобы понять, что интерфейсы способны существенно упростить жизнь.

3. Множественное наследование

В Java все классы могут иметь только один класс-родитель. В других языках программирования классы часто могут иметь несколько классов-родителей. Это очень удобно, но приносит также много проблем.

В Java пришли к компромиссу: запретили множественное наследование классов, но разрешили множественное наследование интерфейсов. Интерфейс может иметь несколько интерфейсов-родителей. Класс может иметь несколько интерфейсов-родителей и только один класс-родитель.

Почему же множественное наследование классов запретили, а интерфейсов — разрешили? Все дело в так называемом пирамидальном наследовании:

original

Когда класс B наследуется от класса A, он ничего не знает о классах C и D. Поэтому он использует переменные класса A так, как считает нужным. Класс C делает то же самое: использует переменные класса A, но уже другим способом. И в классе D это все выливается в конфликт.

Давайте рассмотрим такой простой пример. Допустим, у нас есть 3 класса:

А т.к. интерфейсам запрещено иметь переменные, то и конфликта такого рода у них быть не может. Поэтому разрешено множественное наследование интерфейсов.

Источник

Делаю сам
Adblock
detector