Интерфейс может быть объявлен членом класса или другого интерфейса. Такой интерфейс называется интерфейсом-членом или вложенным интерфейсом. Вложенный в класс интерфейс может быть объявлен как public, private или protected. Это отличает его от интерфейса верхнего уровня или интерфейса вложенного в другой интерфейс, который должен быть либо объявлен как public, либо, как уже было отмечено, должен использовать уровень доступа, заданный по умолчанию.
Когда вложенный в класс интерфейс используется вне содержащей его области определения, он должен определяться именем класса, членом которого он является. То есть вне класса, в котором объявлен вложенный интерфейс, его имя должно быть полностью определено. К интерфейсу вложенному в другой интерфейс таких требований нет, так как они всегда имеют модификатор public.
Вложенный в класс интерфейс объявленный с модификатором private не может быть имплементирован каким-либо классом. Он может использоваться только внутри того класса где был объявлен.
Ну и небольшой примерчик, который демонстрирует все вышеописанное…
Вывод у программы следующий:
Первая строка выводится статическим методом aintPrt2() вложенного в класс А интерфейса Aint1. Вывод генерирует строка 80. Вторая строка выводится при помощи некоторый танцев с бубном, а именно при помощи метода AaPrint() вложенного класса Aa. Вложенные классы мы пока не изучали, поэтому данный бубен может быт не понятен. Далее уже все просто :) ну и по правде сказать лень расписывать подробно. Если чё, то пишите комменты :)
"Вложенный в класс интерфейс объявленный с модификатором protected не может быть имплементирован каким-либо классом. Он может использоваться только внутри того класса где был объявлен." - кажется у Вас тут ошибка, нельзя имплементировать с модификатором доступа privete.
ОтветитьУдалитьОшибка у вас, так как надо внимательней читать. Вы путаете protected и private в с своем же собственном тексте (комментарии).
УдалитьКроме того вы дважды прочитали не внимательно. Вложенный в класс интерфейс объявленный с модификатором private не может быть имплементирован каким-либо классом. Ясно же сказано не может быть имплементирован.
УдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьВо первых я сейчас в отпуске. Во вторых отвечаю на комментарии когда у меня есть время. После отпуска у меня времени особо не будет. Поэтому обещать ни чего не могу. Пишите тут, будет время отвечу.
УдалитьВ 65 строке "// класс С реализует вложенный интерфейс Myinner". В данном случае возникает ошибка. "Когда вложенный интерфейс используется вне содержащей его области определения, он должен определяться именем класса или интерфейса, членом которого он является." Cтрока должна выглядеть так: "class C implements MyInter.Myinner " тогда все заработает.
ОтветитьУдалитьСкорее всего, Вы описали интерфейс MyInter и класс, его имплементирующий (class C implements Myinner), не в пределе одного пакета. Либо Вы не импортировали этот интерфейс. Если кинуть класс С и интерфейс MyInter в один пакет (package), а затем импортировать интерфейс, то всё будет работать.
УдалитьУ меня этот код работает без всяких изменений. Почему не работет у вас и чего вы там наваяли я не знаю :)
ОтветитьУдалитьЯсно же написано: "Это отличает его от интерфейса верхнего уровня или интерфейса вложенного в другой интерфейс, который должен быть либо объявлен как public, либо, как уже было отмечено, должен использовать уровень доступа, заданный по умолчанию."
ОтветитьУдалитьСтрока 65 абсолютно корректна, так как в данном случае интерфейс вложен в другой интерфейс и оба они имеют модификатор доступа public.
Скажите пожалуйста когда необходимо использовать вложенные интерфейсы? Желательно с примером из жизни
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалить