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

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

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

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

Обзор

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

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

Например:

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

Интерфейс:

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

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

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

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

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

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

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

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

общественный интерфейс Хищник {    логический погоня(Добыча п);    пустота естьPrey(Добыча п);}

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

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

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

... орудия InterfaceName[, другой интерфейс, еще один, ...] ...

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

общественный учебный класс Лев орудия Хищник {    @Override    общественный логический погоня(Добыча п) {           // Программирование на преследование добычи p (специально для льва)    }    @Override    общественный пустота естьPrey(Добыча п) {           // Программирование на съедение добычи p (специально для льва)    }}

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

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

общественный учебный класс Лягушка орудия Хищник, Добыча { ... }

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

учебный класс Животное орудия Нравится, НравитсяВода {    логический нравится() { возвращаться истинный; }}

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

учебный класс Животное орудия Акции<Булево>, Акции<Целое число> ...// Ошибка: повторяющийся интерфейс

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

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

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

общественный интерфейс Ядовитый Хищник расширяет Хищник, Ядовитый {    // Тело интерфейса}

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

Примеры

Некоторые общие Ява интерфейсы:

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

Смотрите также

Рекомендации

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

внешняя ссылка