Java - Интерфейсы - Описание
Primary tabs
Forums:
Общая информация
Итерфейс позволяет полностью "отделить" идею того, что должен уметь делать класс и какими полями обладать от того как именно данные действия будут реализованы
Объявление и доступ
- Если сам интерфейс объявлен как public то он может быть использован любым кодом (из любого пакета) - этом случае необходимо, что в этом случае интерфейс был единственным открыым (public) интерфейсом в файле, а имя этого файла должно совпадать с именем интерфейса
- Если интерфейс явно не объявлен как public, то он доступен только из кода того же пакета, что и пакет в котором объявлен данный интерфейс
- Переменные (поля) объявленные внутри интерфейса неявно определяются как static и одновременно final - то есть реализующие этот интерфейс классы данные поля изменять не смогут
- Все методы интерфейса (на практике это просто сигнатуры методов) а также поля неявно определяются как public
- Методы интерфейса не содержат "тел", их объявления заканчивают знаками точки с запятой
Реализация интерфейса
- Один интерфейс может быть реализован одним или множеством классов
- Один класс может реализовывать более одного интерфейса. В этом случае их имена идущие после слова implements в коде программы разделяются запятыми
- Для реализации метода, объявленного в интерфейсе, его сигнатура в реализующем классе должна в точности совпадать с объявленной
- Методы, которые реализуются классом на основе интерфейса должны быть объявлены в классе как public
- Интерфейс можно реализовать частично, но тогда реализующий класс должен быть объявлен как абстрактный
Пример объявления и реализации
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 }
- Log in to post comments
- 3887 reads