К каким членам включающего класса может обращаться статический вложенный класс? - PullRequest
1 голос
/ 23 мая 2019
  1. Java В полном справочнике написано

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

    Что означает «через объект» и «не может ... напрямую»?

  2. Java в двух словах:

    • Тип статического члена может обращаться к (только) к статическим членам класса, который его содержит .

    • Статический тип элемента имеет доступ ко всем статическим элементам (включая любые другие типы статических элементов) своих содержащий тип.

    Избыточны ли эти два предложения друг для друга? В чем различия между двумя предложениями?

  3. Противоречат ли друг другу цитаты из двух книг? Первый цитата говорит, что статический вложенный класс может получить доступ к нестатическому члену включающий класс, в то время как вторая кавычка говорит о статическом типе члена может получить доступ только к статическим членам окружающего класса.

Спасибо.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Никакой статический метод не может получить доступ к полю экземпляра напрямую, без предварительной квалификации его объектом содержащего класса.

class Foo {
   int myField;

   public void main(String[] args) {
       Foo foo = new Foo();
       access(foo);
   }
   public static void access(Foo obj) {
      System.out.println(myField); // <-- error, can't access myField from static 
                                   //context.
      System.out.println(obj.myField); // OK here  
   }
}

То же самое верно для доступа к полям экземпляра через внутренние статические классы.

1 голос
/ 23 мая 2019

В Java вложенные нестатические классы имеют скрытую ссылку на экземпляр родительского класса. Вот почему они могут получить доступ ко всем нестатичным членам. У вложенного класса такого экземпляра нет. Однако его область действия позволяет ему получить доступ к родительским членам, если родительский класс передает this .

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

...