Из Википедии, бесплатной энциклопедии
  (Перенаправлено из интерфейса Java )
Перейти к навигации Перейти к поиску

Интерфейс на языке программирования Java является абстрактным типом , который используется для указания поведения , которое классы должны реализовать. Они похожи на протоколы . Интерфейсы объявляются с использованием interface ключевого слова и могут содержать только сигнатуру метода и объявления констант (объявления переменных, которые объявлены как staticи final). Все методы интерфейса не содержат реализации (тела методов), как во всех версиях ниже Java 8. Начиная с Java 8, defaultи staticметоды могут иметь реализацию в interfaceопределении. [1] Затем в Java 9 privateиprivate staticбыли добавлены методы. В настоящее время интерфейс Java может иметь до шести различных типов.

Интерфейсы не могут быть созданы , а скорее реализованы. Класс, реализующий интерфейс, должен реализовывать все методы, не используемые по умолчанию, описанные в интерфейсе, или быть абстрактным классом . Ссылки на объекты в Java могут быть указаны как интерфейсные; в каждом случае они должны быть либо нулевыми , либо быть привязанными к объекту, реализующему интерфейс.

Одним из преимуществ использования интерфейсов является то, что они имитируют множественное наследование . Все классы в Java должны иметь ровно один базовый класс , за единственным исключением java.lang.Object( корневой класс системы типов Java ); множественное наследование классов не допускается. Однако интерфейс может наследовать несколько интерфейсов, а класс может реализовывать несколько интерфейсов.

Обзор [ править ]

Интерфейсы используются для кодирования сходства, которое разделяют классы различных типов, но не обязательно составляют отношения классов. Например, свистеть могут и человек, и попугай ; однако было бы нецелесообразно представлять s и s как подклассы класса. Скорее всего, они будут подклассами класса (вероятно, с промежуточными классами), но оба будут реализовывать интерфейс.HumanParrotWhistlerAnimalWhistler

Другое использование интерфейсов - это возможность использовать объект, не зная его типа класса, а только то, что он реализует определенный интерфейс. Например, если кого-то раздражает свистящий звук, он может не знать, человек это или попугай, потому что все, что можно определить, - это то, что свистит свист. Вызов whistler.whistle()вызовет реализованный метод whistleобъекта whistlerнезависимо от того, какой у него класс, при условии, что он реализует Whistler. В более практическом примере алгоритм сортировки может ожидать объект типа Comparable. Таким образом, не зная конкретного типа, он знает, что объекты этого типа можно каким-то образом отсортировать.

Например:

интерфейс  Bounceable  {  двойной  пи  =  3,1415 ;  void  setBounce ();  // Обратите внимание на точку с запятой  // Методы интерфейса общедоступны, абстрактны и никогда не являются окончательными.  // Думайте о них только как о прототипах; никакие реализации не допускаются. }

Интерфейс:

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

Использование [ править ]

Определение интерфейса [ править ]

Интерфейсы определяются следующим синтаксисом (сравните с определением класса Java ):

[ видимость ] interface InterfaceName [расширяет другие интерфейсы ] { объявления констант объявления  абстрактных методов}

Пример: открытый интерфейс Interface1 расширяет Interface2;

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

Таким образом, простой интерфейс может быть

открытый  интерфейс  Predator  {  логическое  chasePrey ( Prey  p );  void  eatPrey ( Prey  p ); }

Объявления типа члена в интерфейсе неявно являются статическими, окончательными и общедоступными, но в остальном они могут быть любым типом класса или интерфейса. [2]

Реализация интерфейсов в классе [ править ]

В синтаксисе реализации интерфейса используется эта формула:

... реализует InterfaceName [, другой интерфейс , другой , ...] ...

Классы могут реализовывать интерфейс. Например:

открытый  класс  Lion  реализует  Predator  { @Override  public  boolean  chasePrey ( Prey  p )  {  // Программирование на преследование добычи p (специально для льва)  } @Override  public  void  eatPrey ( Prey  p )  {  // Программирование на есть добычу p (специально для льва)  } }

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

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

открытый  класс  Frog  реализует  Predator ,  Prey  {  ...  }

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

класс  Animal  реализует  LikesFood ,  LikesWater  {  логическое значение  любит ()  {  return  true ;  } }

Однако данный класс не может реализовывать один и тот же или подобный интерфейс несколько раз:

class  Animal  реализует  Shares < Boolean > ,  Shares < Integer >  ... // Ошибка: повторяющийся интерфейс

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

Подынтерфейсы [ править ]

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

открытый  интерфейс  VenomousPredator  расширяет  Predator ,  Venomous  {  // тело интерфейса }

является законным и определяет подинтерфейс. В отличие от классов, он допускает множественное наследование. Predatorи, Venomousвозможно, может определять или наследовать методы, скажем, с той же сигнатурой kill(Prey p). Когда класс реализует, VenomousPredatorон реализует оба метода одновременно.

Примеры [ править ]

Вот некоторые распространенные интерфейсы Java :

  • Comparableимеет метод compareTo, который используется для описания двух объектов как равных или для обозначения того, что один из них больше другого. Обобщения позволяют реализовать классы, чтобы указать, какие экземпляры классов можно сравнивать с ними.
  • Serializableэто интерфейс маркера без методов или полей - он имеет пустое тело. Он используется, чтобы указать, что класс может быть сериализован . Его Javadoc описывает, как он должен работать, хотя ничего программно не применяется

См. Также [ править ]

  • Mixin
  • Черта (компьютерное программирование)

Ссылки [ править ]

  1. ^ «Методы по умолчанию» . Архивировано из оригинала на 2017-05-23 . Проверено 30 июня 2014 .
  2. ^ «Спецификация языка Java» .
  3. Митчелл, Джон Д. (1 июня 1996 г.). «Совет по Java 10: Реализуйте процедуры обратного вызова на Java» . JavaWorld . Проверено 14 июля 2020 .

Внешние ссылки [ править ]

  • Что такое интерфейс?