Java - Интерфейсы - Описание

Общая информация

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

Объявление и доступ

  1. Если сам интерфейс объявлен как public то он может быть использован любым кодом (из любого пакета) - этом случае необходимо, что в этом случае интерфейс был единственным открыым (public) интерфейсом в файле, а имя этого файла должно совпадать с именем интерфейса
  2. Если интерфейс явно не объявлен как public, то он доступен только из кода того же пакета, что и пакет в котором объявлен данный интерфейс
  3. Переменные (поля) объявленные внутри интерфейса неявно определяются как static и одновременно final - то есть реализующие этот интерфейс классы данные поля изменять не смогут
  4. Все методы интерфейса (на практике это просто сигнатуры методов) а также поля неявно определяются как public
  5. Методы интерфейса не содержат "тел", их объявления заканчивают знаками точки с запятой

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

  1. Один интерфейс может быть реализован одним или множеством классов
  2. Один класс может реализовывать более одного интерфейса. В этом случае их имена идущие после слова implements в коде программы разделяются запятыми
  3. Для реализации метода, объявленного в интерфейсе, его сигнатура в реализующем классе должна в точности совпадать с объявленной
  4. Методы, которые реализуются классом на основе интерфейса должны быть объявлены в классе как public
  5. Интерфейс можно реализовать частично, но тогда реализующий класс должен быть объявлен как абстрактный

Пример объявления и реализации

interface SomePlugin{
   String getName(); // метод
   void printThis(String str, int count); // метод
 }

И давайте сразу же реализуем этот интерфейс,
например так:

// указываем доступ (не обязательно), имя класса
// и имена реализуемых интерфейсов
public class MyPlugin implements SomePlugin{ 

   public String getName(){ //реализуем метод
       return "MyPlugin"; // возвращаем строку с именем
   }
   public void printThis(String str, int count) {  //реализуем метод
         for (int i=1; i <= count; i++) // count раз 
               System.Out.Println(str); // выводим сторку в консоль  
    }
    void callOwnMethod(){ // собственный метод, отношения к интерфейсу не имеет
       System.Out.Println("Hellow World! =)");
   }
 }

Доступ к реализации через ссылки на интерфейсы

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

Вложенные интерфейсы

Вложенные интерфейсы - ещё их называют интерфейсами-членами могут быть определены внутри некоторого класса. Если их при этом требуется реализовать вне класса определения то, имя интерфейса должно быть "полным" (то есть с указанием класса-родителя):

Пример:

Class A{
  interface GoodInt(){ // вложенный интерфейс
       void printMe(String str); // метод интерфейса
   }
}
// далее реализуем в классе B 
// внутренний интерфейс GoodInt класса А

Class B implements A.GoodInt{ //  A.GoodInt - полное имя интерфейса
    public void printMe(String str){ // реализуем этот метод
        System.Out.Println(str); // печатаем строку
     } 
}

Вложенный интерфейс также (помимо public) может быть объявлен как private или protected - что отличает его от интерфейса "верхнего уровня" (см. выше).

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

Один интерфейс можно расширить за счёт другого - класс который будет реализовывать расширенный интерфейс должен реализовать всю сумму методов.
Расширяется интерфейс с помощью слова extends.

Например:

interface A extends B(){
 void method3(); // дополниетельный метод 
//  интерфейса А ко всем методам  и полям интерфейса B 
}

Key Words for FKN + antitotal forum (CS VSU):