Защищенные/общедоступные внутренние классы

Может кто-нибудь объяснить мне, в чем разница между классами protected/public Inner?

Я знаю, что внутренние классы public должны избегать как можно больше (как описано в этой статье ).

Но из того, что я могу сказать, нет никакой разницы между использованием модификаторов protected или public.

Взгляните на этот пример:

public class Foo1 {
 public Foo1() { }

 protected class InnerFoo {
  public InnerFoo() {
   super();
  }
 }
}

...

public class Foo2 extends Foo1 {
 public Foo2() {
  Foo1.InnerFoo innerFoo = new Foo1.InnerFoo();
 }
}

...

public class Bar {
 public Bar() {
  Foo1 foo1 = new Foo1();
  Foo1.InnerFoo innerFoo1 = foo1.new InnerFoo();

  Foo2 foo2 = new Foo2();
  Foo2.InnerFoo innerFoo2 = foo2.new InnerFoo();
 }
}

Все эти компиляции и действительны, объявляю ли я InnerFoo protected или public.

Что мне не хватает? Пожалуйста, укажите мне случай, когда есть разница в использовании protected или public.

Спасибо.

Ответ 1

Модификатор доступа protected ограничит доступ к классам, отличным от тех, которые находятся в одном пакете и его подклассах.

В показанном примере public и protected будут иметь тот же эффект, что и в одном пакете.

Для получения дополнительной информации о модификаторах доступа, Контроль доступа к членам класса" "Учебники Java" могут представлять интерес.

Ответ 2

Вы можете просто думать, что защищенный внутренний класс является защищенным членом, поэтому он доступен только для класса, пакета, подкласса, но не для мира.

Кроме того, для класса outter для него существует только два модификатора доступа. Просто публичный и пакет.