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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

  • Экземпляр нестационарного внутреннего класса создается со ссылкой объекта внешнего класса, в котором он определил, это означает, что он имеет охватывающий экземпляр. Но экземпляр статического внутреннего класса созданный без ссылки на класс 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(); 
    }
}

Ответ 4

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

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

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

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

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

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

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

Ответ 5

Обсуждение вложенных классов...

Отличие состоит в том, что вложенное объявление класса, которое также является статическим, может быть создано вне класса-оболочки.

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

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

Ответ 6

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

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

Да, в семантике статического вложенного типа нет ничего, что помешало бы вам сделать это. Этот фрагмент отлично работает.

    public class MultipleInner {
        static class Inner {
        }   
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Inner();
        }
    }
}

это код, размещенный на этом веб-сайте...

для вопроса --- > Может ли статический вложенный класс запускаться несколько раз?

ответ был --- >

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

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

Обратите внимание, что технически статический вложенный тип не является "внутренним" типом.

Ответ 7

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

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

Ответ 8

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