Подтвердить что ты не робот

Почему допускается создание объекта статического вложенного класса?

Я начал изучать язык Java для разработки приложений Android.

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

Но почему экземпляр статического вложенного объекта класса допускается в следующем situaltion?

class EnclosingClass 
{     
      //...     
      class static StaticInnerClass 
      {         
          //...     
      } 
} 

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

EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()
4b9b3361

Ответ 1

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

Ваше понимание значения "статического класса" неверно. В принципе "статический класс" в Java представляет собой вложенный класс, который не имеет неявной ссылки на экземпляр содержащего класса. Подробнее см. раздел 8.5.1 JLS, в частности:

Статическое ключевое слово может изменить объявление типа элемента C внутри тела не внутреннего класса или интерфейса T. Его эффект заключается в том, чтобы объявить, что C не является внутренним классом. Подобно тому, как статический метод T не имеет текущего экземпляра T в своем теле, C также не имеет текущего экземпляра T и не имеет никаких лексически закрывающих экземпляров.

Возможно, вы думали о статических классах на С#, которые совершенно разные?

Ответ 2

В соответствии с документацией оракула

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

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

Доступ к статическим вложенным классам осуществляется с помощью имени класса:

OuterClass.StaticNestedClass

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

OuterClass.StaticNestedClass nestedObject =
     new OuterClass.StaticNestedClass();

Ответ 3

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

Возможно, вам понадобится использовать nested class в контексте static, например:

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    class InnerClass {

    }
}  

В этом случае при попытке создать экземпляр innerClass вы получите сообщение об ошибке:

Нет доступного экземпляра типа Test. Должна выделение с охватывающим экземпляром типа Test (например, x.new A() где x - пример теста).

Чтобы этого избежать, вы можете создать экземпляр объекта типа Test и создать из него экземпляр innerClass:

Test test = new Test();
InnerClass innerClass = test.new InnerClass();

или лучше, объявите также innerClass как статический и создайте его в статическом контексте:

public class Test {

    public static void main(String args[]) {
        InnerClass innerClass = new InnerClass();
    }

    static class InnerClass {

    }
}