Экземпляр и область охвата внутреннего класса - PullRequest
0 голосов
/ 27 января 2020

Многие стандартные книги (например, действующие Java) и справочные материалы ссылаются на включающие экземпляры и включающие области охвата при обсуждении внутренних классов. Это также обсуждалось и в других вопросах Нет Ошибка включающего экземпляра и Анонимные классы, включающие также экземпляры .

Что означают включающий экземпляр и область действия по отношению к stati c вложенные (внутренние) классы? Соответственно, почему бы нам не беспокоиться о включении экземпляров в вложенные классы c?

1 Ответ

0 голосов
/ 27 января 2020

Допустим, у нас есть класс Foo со статическим c -несведенным и внутренним классом ( Типы вложенных классов ):

public class Foo{
  // <---------------------------|
  void hello() {             //  |
    System.out.print("Hello");// enclosing scope of InnerFoo
  }                           // |
  // <---------------------------| 
  public class InnerFoo{
    void world() {
      System.out.print("World");
    }  
  }
  // <---------------------------------|
public static class StaticNestedFoo{ //|
    void world() {                  // |
      System.out.print("World");    // enclosing scope of InnerFoo
    }                               // |
  }                                 // |
  // <---------------------------------|
}

Как видно, охватывающая область класса InnerFoo - это область (блоки / методы / типы), соответствующая тому, где объявлен InnerFoo.

Теперь, если мы хотим использовать класс InnerFoo, нам необходимо:

Foo f = new Foo(); // enclosing instance needed to construct InnerFoo
Foo.InnerFoo ifoo = f.new InnerFoo();
ifoo.world();

Как отмечено в комментарии, включающий экземпляр является экземпляром (из Foo здесь), который нам нужно создать, чтобы создать нестатический c вложенный класс.

Наконец, если у нас есть вложенный класс stati c, нам не нужен включающий экземпляр Foo, и мы можем напрямую ссылаться на него:

Foo.StaticNestedFoo sfoo = new Foo.StaticNestedFoo();
sfoo.world();

член stati c переменная / метод класса является общей для всех экземпляров класса, поэтому напрямую доступна по имени класса. Аналогичным образом можно считать, что вложенный класс c является независимым от какого-либо экземпляра, поэтому не требует создания вложенного экземпляра.

Исходный код

Связанный: Что такое область видимости в Java? , действительно путается с "областью охвата" javascript es6 функция стрелки

...