Учебники

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

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

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

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

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

Интерфейс похож на класс в следующих отношениях —

  • Интерфейс может содержать любое количество методов.

  • Интерфейс записывается в файл с расширением .java , имя интерфейса которого совпадает с именем файла.

  • Байт-код интерфейса появляется в файле .class .

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

Интерфейс может содержать любое количество методов.

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

Байт-код интерфейса появляется в файле .class .

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

Тем не менее, интерфейс отличается от класса в нескольких отношениях, в том числе —

  • Вы не можете создать экземпляр интерфейса.

  • Интерфейс не содержит конструкторов.

  • Все методы в интерфейсе являются абстрактными.

  • Интерфейс не может содержать поля экземпляра. Единственные поля, которые могут появиться в интерфейсе, должны быть объявлены как static, так и final.

  • Интерфейс не расширен классом; это реализуется классом.

  • Интерфейс может расширять несколько интерфейсов.

Вы не можете создать экземпляр интерфейса.

Интерфейс не содержит конструкторов.

Все методы в интерфейсе являются абстрактными.

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

Интерфейс не расширен классом; это реализуется классом.

Интерфейс может расширять несколько интерфейсов.

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

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

пример

Ниже приведен пример интерфейса —

/* File name : NameOfInterface.java */
import java.lang.*;
// Any number of import statements

public interface NameOfInterface {
   // Any number of final, static fields
   // Any number of abstract method declarations\
}

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

  • Интерфейс неявно абстрактный. Вам не нужно использовать ключевое слово abstract при объявлении интерфейса.

  • Каждый метод в интерфейсе также неявно абстрактный, поэтому ключевое слово abstract не требуется.

  • Методы в интерфейсе неявно общедоступны.

Интерфейс неявно абстрактный. Вам не нужно использовать ключевое слово abstract при объявлении интерфейса.

Каждый метод в интерфейсе также неявно абстрактный, поэтому ключевое слово abstract не требуется.

Методы в интерфейсе неявно общедоступны.

пример

/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

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

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

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

пример

/* File name : MammalInt.java */
public class MammalInt implements Animal {

   public void eat() {
      System.out.println("Mammal eats");
   }

   public void travel() {
      System.out.println("Mammal travels");
   } 

   public int noOfLegs() {
      return 0;
   }

   public static void main(String args[]) {
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
} 

Это даст следующий результат —

Выход

Mammal eats
Mammal travels

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

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

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

  • Сам класс реализации может быть абстрактным, и если это так, методы интерфейса не должны быть реализованы.

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

Сигнатура метода интерфейса и того же возвращаемого типа или подтипа должна сохраняться при переопределении методов.

Сам класс реализации может быть абстрактным, и если это так, методы интерфейса не должны быть реализованы.

При реализации интерфейсов существует несколько правил —

  • Класс может реализовывать более одного интерфейса одновременно.

  • Класс может расширять только один класс, но реализовывать множество интерфейсов.

  • Интерфейс может расширять другой интерфейс, аналогично тому, как класс может расширять другой класс.

Класс может реализовывать более одного интерфейса одновременно.

Класс может расширять только один класс, но реализовывать множество интерфейсов.

Интерфейс может расширять другой интерфейс, аналогично тому, как класс может расширять другой класс.

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

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

Следующий интерфейс Sports расширен интерфейсами Hockey и Football.

пример

// Filename: Sports.java
public interface Sports {
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// Filename: Football.java
public interface Football extends Sports {
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// Filename: Hockey.java
public interface Hockey extends Sports {
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

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

Расширение нескольких интерфейсов

Класс Java может расширять только один родительский класс. Многократное наследование не допускается. Однако интерфейсы не являются классами, и интерфейс может расширять несколько родительских интерфейсов.

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

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

пример

public interface Hockey extends Sports, Event

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

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

пример

package java.util;
public interface EventListener
{}

Интерфейс без методов называется интерфейсом тегирования . Существует две основные цели разработки интерфейсов тегирования —

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

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