Интерфейс может бьrгь объявлен членом класса или другого интерфейса. Такой интерфейс называется иитерфейсом-членом или вложенным иитерфейсом.
Вложенный интерфейс может быть объявлен как public, private или protected. Этим он отличается от интерфейса верхнего уровня, который должен бьrгь объявлен как public или использовать уровень доступа по умолчанию.
Когда вложенный интерфейс используется за пределами объемлющей его области действия, его имя должно быть дополнительно уточнено именем класса или интерфейса, членом которого он является.
Это означает, что за пределами класса или интерфейса, в котором объявлен вложенный интерфейс, его имя должно бьrгь уточнено полностью.
В следующем примере демонстрируется применение вложенного интерфейса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// Простой пример вложенного интерфейса // Следующий класс содержит интерфейс как свой член class FirstClass { // внимание, это вложенный интерфейс public interface NiceNested { boolean isNotPositive(int x); } } // класс SecondClass реализует вложенный интерфейс class SecondClass implements FirstClass.NiceNested { public boolean isNotPositive(int x) { return x >= 0 ? false : true; } } class NestedInterface { public static void main(String args[]) { // использовать ссылку на вложенный интерфейс FirstClass.NiceNested iface = new SecondClass(); if(iface.isNotPositive(-102030)) { System.out.println("Число -102030 не позитивное"); } if(iface.isNotPositive(50033)) { System.out.println("Это не будет выведено"); } } } |
После запуска программы получаем:
1 2 3 4 |
pro-java@admin:~$ javac NestedInterface.java pro-java@admin:~$ java NestedInterface Число -102030 не позитивное pro-java@admin:~$ |
Обратите внимание на то, что в классе FirstClass определяется вложенный интерфейс NiceNested объявленный как public. Затем вложенный интерфейс реализуется в классе SecondClass следующим образом:
1 |
class SecondClass implements FirstClass.NiceNested |
Обратите также внимание на то, что имя интерфейса полностью уточнено и содержит имя класса. В теле метода main() создается переменная iface ссылки на интерфейс FirstClass.NiceNested, которой присваивается ссылка на объект класса SecondClass.
И это вполне допустимо, поскольку класс SecondClass реализует интерфейс FirstClass.NiceNested.