Допустим, у нас есть класс 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 функция стрелки