локальный - статические классы java




Java: статический и внутренний класс (6)

  1. Статический внутренний класс не может получить доступ к нестационарным членам охватывающего класса. Он может напрямую обращаться к статическим членам (полем и методам экземпляра) того же класса, что и процедурный стиль получения значения без создания объекта.

  2. Статический внутренний класс может объявлять как статические, так и нестатические элементы. Статические методы имеют доступ к статическим членам основного класса. Однако он не может получить доступ к нестационарным внутренним членам класса. Чтобы получить доступ к членам нестатического внутреннего класса, он должен создать объект нестатического внутреннего класса.

  3. Нестатический внутренний класс не может объявлять статические поля и статические методы. Он должен быть объявлен как в статическом, так и в верхнем уровне. Вы получите эту ошибку, указав, что «статические поля объявляются только в статическом или верхнем уровне».

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

  5. Закрывающий класс не может обращаться к членам внутренних классов, пока не создаст объект внутренних классов. Если основной класс при доступе к членам нестатического класса может создать объект нестатического внутреннего класса.

  6. Если основной класс при доступе к членам статического внутреннего класса имеет два случая:

    • Случай 1: для статических членов он может использовать имя класса статического внутреннего класса
    • Случай 2: для нестатических членов он может создать экземпляр статического внутреннего класса.

На этот вопрос уже есть ответ:

В чем разница между статическим и нестационарным внутренним классом?


Внутренний класс по определению не может быть статичным, поэтому я собираюсь переформулировать ваш вопрос как «В чем разница между статическими и нестатическими вложенными классами?»

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


Давайте посмотрим в источник мудрости на такие вопросы: Эффективная Java-игра Джошуа Блоха :

Технически нет такой вещи, как статический внутренний класс. Согласно эффективной Java , правильная терминология является статическим вложенным классом . Нестатический вложенный класс действительно является внутренним классом, а также анонимными классами и локальными классами.

И теперь, чтобы процитировать:

Каждый экземпляр нестатического [вложенного] класса неявно связан с вмещающим экземпляром его содержащего класса ... Можно вызвать методы для экземпляра окружения.

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


Между статическими внутренними и нестационарными внутренними классами существуют две отличия.

  1. В случае объявления полей и методов члена нестационарный внутренний класс не может иметь статические поля и методы. Но в случае статического внутреннего класса могут иметь статические и нестатические поля и метод.

  2. Экземпляр нестационарного внутреннего класса создается с ссылкой на объект внешнего класса, в котором он определен, это означает, что он содержит экземпляр. Но экземпляр статического внутреннего класса создается без ссылки на класс Outer, что означает, что он не имеет экземпляра окружения.

См. Этот пример

class A
{
    class B
    {
        // static int x; not allowed here
    }

    static class C
    {
        static int x; // allowed here
    }
}

class Test
{
    public static void main(String… str)
    {
        A a = new A();

        // Non-Static Inner Class
        // Requires enclosing instance
        A.B obj1 = a.new B(); 

        // Static Inner Class
        // No need for reference of object to the outer class
        A.C obj2 = new A.C(); 
    }
}

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


статический внутренний класс: может объявлять статические и нестатические элементы, но может получить доступ только к статическим членам класса его родителей.

нестационарный внутренний класс: может объявлять только нестатические члены, но может обращаться к статическому и нестационарному члену своего родительского класса.







inner-classes