Почему допускается создание объекта статического вложенного класса?
Я начал изучать язык Java для разработки приложений Android.
В соответствии с моим пониманием, основанным на статическом классе, мы не можем создать объект статического класса.
Но почему экземпляр статического вложенного объекта класса допускается в следующем situaltion?
class EnclosingClass
{
//...
class static StaticInnerClass
{
//...
}
}
Почему мы можем создать объект внутреннего класса, если он помечен как статический?
EnclosingClass.StaticInnerClass s = new EnclosingClass.StaticInnerClass()
Ответы
Ответ 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 {
}
}
Ответ 4
проверить это, может быть, это может помочь вам
Вложенные классы