Java: статический vs внутренний класс [дубликат]



этот вопрос уже есть ответ здесь:



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

735   8  

8 ответов:

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

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

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

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

а теперь цитата:

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

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

существует два различия между статическими внутренними и нестатическими внутренними классами.

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

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

посмотреть этот пример

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

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

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

  4. нестатический внутренний класс может получить доступ как к статическим, так и к нестатическим членам класса enclosing в процедурном стиле получения значение, но он не может получить доступ к членам статического внутреннего класса.

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

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

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

обсуждаем вложенные классы...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.