Jump to content

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

(Перенаправлено из интерфейса Java )

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

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

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

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

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

Например:

interface Bounceable {    double pi = 3.1415;    void setBounce();  // Note the semicolon                       // Interface methods are public, abstract and never final.                        // Think of them as prototypes only; no implementations are allowed.}

Интерфейс:

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

Использование

[ редактировать ]

Определение интерфейса

[ редактировать ]

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

[visibility] interface InterfaceName [extends other interfaces] {        constant declarations        abstract method declarations         static method declarations}

Пример: общедоступный интерфейс Interface1 расширяет Interface2;

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

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

public interface Predator {    boolean chasePrey(Prey p);    void eatPrey(Prey p);}

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

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

[ редактировать ]

Синтаксис реализации интерфейса использует следующую формулу:

... implements InterfaceName[, another interface, another, ...] ...

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

public class Lion implements Predator {    @Override    public boolean chasePrey(Prey p) {           // Programming to chase prey p (specifically for a lion)    }    @Override    public void eatPrey(Prey p) {           // Programming to eat prey p (specifically for a lion)    }}

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

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

public class Frog implements Predator, Prey { ... }

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

class Animal implements LikesFood, LikesWater {    boolean likes() { return true; }}

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

class Animal implements Shares<Boolean>, Shares<Integer> ...// Error: repeated interface

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

Субинтерфейсы

[ редактировать ]

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

public interface VenomousPredator extends Predator, Venomous {    // Interface body}

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б с д Блох 2018 .
  2. ^ «Методы по умолчанию» . Архивировано из оригинала 23 мая 2017 г. Проверено 30 июня 2014 г.
  3. ^ «Спецификация языка Java» .
  4. ^ Митчелл, Джон Д. (1 июня 1996 г.). «Совет 10 по Java. Реализуйте процедуры обратного вызова на Java» . JavaWorld . Проверено 14 июля 2020 г.
  • Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN  978-0134685991 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 96a166a290353a798c992663136e5dd8__1718559720
URL1:https://arc.ask3.ru/arc/aa/96/d8/96a166a290353a798c992663136e5dd8.html
Заголовок, (Title) документа по адресу, URL1:
Interface (Java) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)