Интерфейс (Java)

Поделись знанием:
Перейти к: навигация, поиск
К:Википедия:Страницы на КУ (тип: не указан)

Интерфейс - важная конструкция для реализации объектно-ориентированного программирования в языке программирования Java. Один из вариантов абстрактного класса.

В отличие от C++, Java не позволяет наследовать больше одного класса. В качестве альтернативы множественному наследованию существуют интерфейсы. Каждый класс в Java может реализовать любой набор интерфейсов. Порождать объекты от интерфейсов в Java нельзя. Доступно расширение одного интерфейса другим по аналогии с наследованием.



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

Объявление интерфейсов очень похоже на упрощённое объявление классов.

Оно начинается с заголовка. Сначала указываются модификаторы. Интерфейс может быть объявлен как public, и тогда он будет доступен для общего использования, либо модификатор доступа может не указываться, в этом случае интерфейс доступен только для типов своего пакета. Модификатор abstract для интерфейса не требуется, поскольку все интерфейсы являются абстрактными классами. Его можно указать, но делать этого не рекомендуется, чтобы не загромождать код.

Далее записывается ключевое слово interface и имя интерфейса.

После этого может следовать ключевое слово extends и список интерфейсов, от которых будет наследоваться объявляемый интерфейс. Родительских типов (классов и/или интерфейсов) может быть много — главное, чтобы не было повторений, и чтобы отношение наследования не образовывало циклической зависимости.

Наследование интерфейсов действительно очень гибкое. Так, если есть два интерфейса, A и B, причем B наследуется от A, то новый интерфейс C может наследоваться от них обоих. Впрочем, понятно, что при наследовании от B, указание наследования от A является избыточным, так как все элементы этого интерфейса и так будут получены по наследству через интерфейс B.

Затем в фигурных скобках записывается тело интерфейса.

Пример объявления интерфейса (Ошибка если Colorable и Resizable классы: The type Colorable and Resizable cannot be a superinterface of Drawable; a superinterface must be an interface):

public interface Drawable extends Colorable, Resizable {
}

Тело интерфейса состоит из объявления элементов, то есть полей-констант и абстрактных методов. Все поля интерфейса автоматически являются public final static, так что эти модификаторы указывать необязательно и даже нежелательно, чтобы не загромождать код. Поскольку поля являются финальными, необходимо их сразу инициализировать.

public interface Directions {
  int RIGHT=1;
  int LEFT=2;
  int UP=3;
  int DOWN=4;
}

Все методы интерфейса являются public abstract, и эти модификаторы также необязательны.

public interface Moveable {
  void moveRight();
  void moveLeft();
  void moveUp();
  void moveDown();
}

Как видно, описание интерфейса гораздо проще, чем объявление класса.

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

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

interface I
{
   void interfaceMethod();
}

public class ImplementingInterface implements I
{
   void interfaceMethod()
   {
      System.out.println("Этот метод реализован из интерфейса I");
   }
}

public static void main(String[] args)
{
   ImplementingInterface temp = new ImplementingInterface();
   temp.interfaceMethod();
}

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

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

interface A {
  int getValue();
}

interface B {
  double getValue();
}

interface C {
  int getValue();
}

public class Correct implements A, C // класс правильно наследует методы с одинаковой сигнатурой
{
   int getValue()
   {
      return 5;
   }
}

class Wrong implements A, B // класс вызывает ошибку при компиляции
{
   int getValue()
   {
      return 5;
   }

   double getValue()
   {
      return 5.5;
   }
}

Напишите отзыв о статье "Интерфейс (Java)"

Ссылки

  • [docs.oracle.com/javase/tutorial/java/concepts/interface.html What Is an Interface?] / The Java Tutorials, Oracle  (англ.)
  • [tutorials.jenkov.com/java/interfaces.html Java Interfaces] / Jakob Jenkov, 2015-07-04  (англ.)
  • [sernam.ru/book_java.php?id=42 8.2. Интерфейсы] / Основы программирования на Java: учебное пособие / С. А. Сухов. -Ульяновск: УлГТУ, 2006. - 88 с.
  • [www.intuit.ru/studies/courses/4453/686/lecture/14106 Лекция 13: Java: механизмы наследования, ссылочные типы данных, интерфейсы, вложенные классы ] / Ирина Баженова, Владимир Сухомлин. Введение в программирование, МГУ им. М.В.Ломоносова, 03.10.2006
  • [www.intuit.ru/studies/courses/569/425/lecture/9679 Лекция 8: Наследование: проблемы и альтернативы. Интерфейсы. Композиция] / Вадим Монахов. Язык программирования Java и среда NetBeans - 04.12.2009

Отрывок, характеризующий Интерфейс (Java)

Голоса и шаги огромной дворни и приехавших с подводами мужиков звучали, перекликиваясь, на дворе и в доме. Граф с утра выехал куда то. Графиня, у которой разболелась голова от суеты и шума, лежала в новой диванной с уксусными повязками на голове. Пети не было дома (он пошел к товарищу, с которым намеревался из ополченцев перейти в действующую армию). Соня присутствовала в зале при укладке хрусталя и фарфора. Наташа сидела в своей разоренной комнате на полу, между разбросанными платьями, лентами, шарфами, и, неподвижно глядя на пол, держала в руках старое бальное платье, то самое (уже старое по моде) платье, в котором она в первый раз была на петербургском бале.
Наташе совестно было ничего не делать в доме, тогда как все были так заняты, и она несколько раз с утра еще пробовала приняться за дело; но душа ее не лежала к этому делу; а она не могла и не умела делать что нибудь не от всей души, не изо всех своих сил. Она постояла над Соней при укладке фарфора, хотела помочь, но тотчас же бросила и пошла к себе укладывать свои вещи. Сначала ее веселило то, что она раздавала свои платья и ленты горничным, но потом, когда остальные все таки надо было укладывать, ей это показалось скучным.
– Дуняша, ты уложишь, голубушка? Да? Да?
И когда Дуняша охотно обещалась ей все сделать, Наташа села на пол, взяла в руки старое бальное платье и задумалась совсем не о том, что бы должно было занимать ее теперь. Из задумчивости, в которой находилась Наташа, вывел ее говор девушек в соседней девичьей и звуки их поспешных шагов из девичьей на заднее крыльцо. Наташа встала и посмотрела в окно. На улице остановился огромный поезд раненых.
Девушки, лакеи, ключница, няня, повар, кучера, форейторы, поваренки стояли у ворот, глядя на раненых.
Наташа, накинув белый носовой платок на волосы и придерживая его обеими руками за кончики, вышла на улицу.
Бывшая ключница, старушка Мавра Кузминишна, отделилась от толпы, стоявшей у ворот, и, подойдя к телеге, на которой была рогожная кибиточка, разговаривала с лежавшим в этой телеге молодым бледным офицером. Наташа подвинулась на несколько шагов и робко остановилась, продолжая придерживать свой платок и слушая то, что говорила ключница.
– Что ж, у вас, значит, никого и нет в Москве? – говорила Мавра Кузминишна. – Вам бы покойнее где на квартире… Вот бы хоть к нам. Господа уезжают.
– Не знаю, позволят ли, – слабым голосом сказал офицер. – Вон начальник… спросите, – и он указал на толстого майора, который возвращался назад по улице по ряду телег.
Наташа испуганными глазами заглянула в лицо раненого офицера и тотчас же пошла навстречу майору.
– Можно раненым у нас в доме остановиться? – спросила она.
Майор с улыбкой приложил руку к козырьку.
– Кого вам угодно, мамзель? – сказал он, суживая глаза и улыбаясь.
Наташа спокойно повторила свой вопрос, и лицо и вся манера ее, несмотря на то, что она продолжала держать свой платок за кончики, были так серьезны, что майор перестал улыбаться и, сначала задумавшись, как бы спрашивая себя, в какой степени это можно, ответил ей утвердительно.
– О, да, отчего ж, можно, – сказал он.
Наташа слегка наклонила голову и быстрыми шагами вернулась к Мавре Кузминишне, стоявшей над офицером и с жалобным участием разговаривавшей с ним.
– Можно, он сказал, можно! – шепотом сказала Наташа.
Офицер в кибиточке завернул во двор Ростовых, и десятки телег с ранеными стали, по приглашениям городских жителей, заворачивать в дворы и подъезжать к подъездам домов Поварской улицы. Наташе, видимо, поправились эти, вне обычных условий жизни, отношения с новыми людьми. Она вместе с Маврой Кузминишной старалась заворотить на свой двор как можно больше раненых.
– Надо все таки папаше доложить, – сказала Мавра Кузминишна.
– Ничего, ничего, разве не все равно! На один день мы в гостиную перейдем. Можно всю нашу половину им отдать.
– Ну, уж вы, барышня, придумаете! Да хоть и в флигеля, в холостую, к нянюшке, и то спросить надо.
– Ну, я спрошу.
Наташа побежала в дом и на цыпочках вошла в полуотворенную дверь диванной, из которой пахло уксусом и гофманскими каплями.
– Вы спите, мама?
– Ах, какой сон! – сказала, пробуждаясь, только что задремавшая графиня.
– Мама, голубчик, – сказала Наташа, становясь на колени перед матерью и близко приставляя свое лицо к ее лицу. – Виновата, простите, никогда не буду, я вас разбудила. Меня Мавра Кузминишна послала, тут раненых привезли, офицеров, позволите? А им некуда деваться; я знаю, что вы позволите… – говорила она быстро, не переводя духа.
– Какие офицеры? Кого привезли? Ничего не понимаю, – сказала графиня.
Наташа засмеялась, графиня тоже слабо улыбалась.