Java: статический и внутренний класс
В чем разница между статическим и нестатическим вложенным классом?
8 ответов
Внутренний класс, по определению, не может быть статическим, поэтому я собираюсь переформулировать ваш вопрос как "В чем разница между статическими и нестатическими вложенными классами?"
Нестатический вложенный класс имеет полный доступ к членам класса, в который он вложен. Статический вложенный класс не имеет ссылки на экземпляр вложенности, поэтому статический вложенный класс не может вызывать нестатические методы или обращаться к нестатическим полям экземпляра класса, в который он вложен.
Давайте посмотрим на источник мудрости для таких вопросов: Эффективная Java Джошуа Блоха:
Технически, не существует такого понятия, как статический внутренний класс. Согласно Effective Java, правильная терминология - это статический вложенный класс. Нестатический вложенный класс действительно является внутренним классом, наряду с анонимными классами и локальными классами.
А теперь процитирую:
Каждый экземпляр нестатического [вложенного] класса неявно связан с вмещающим экземпляром его содержащего класса... Можно вызывать методы для вмещающего экземпляра.
Статический вложенный класс не имеет доступа к включающему экземпляру. Он также использует меньше места.
Есть два различия между статическими внутренними и нестатическими внутренними классами.
В случае объявления полей и методов-членов не статический внутренний класс не может иметь статических полей и методов. Но, в случае статического внутреннего класса, могут иметь статические и нестатические поля и метод.
Экземпляр нестатического внутреннего класса создается со ссылкой на объект внешнего класса, в котором он определен, это означает, что он имеет включающий экземпляр. Но экземпляр статического внутреннего класса создается без ссылки на класс 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();
}
}
Статический внутренний класс не может получить доступ к нестатическим членам включающего класса. Он может напрямую обращаться к статическим членам (полю экземпляра и методам) включающего класса, так же как и процедурный стиль получения значения без создания объекта.
Статический внутренний класс может объявлять как статические, так и нестатические члены. Статические методы имеют доступ к статическим членам основного класса. Однако он не может получить доступ к нестатическим членам внутреннего класса. Чтобы получить доступ к членам нестатического внутреннего класса, он должен создать объект нестатического внутреннего класса.
Нестатический внутренний класс не может объявлять статическое поле и статические методы. Он должен быть объявлен в статических типах или типах верхнего уровня. Вы получите эту ошибку, сказав, что "статические поля объявляются только в статических типах или типах верхнего уровня".
Нестатический внутренний класс может обращаться как к статическим, так и к нестатическим членам включающего класса в процедурном стиле получения значения, но он не может получить доступ к членам статического внутреннего класса.
Вмещающий класс не может получить доступ к членам внутренних классов, пока он не создаст объект внутренних классов. Если основной класс при доступе к членам нестатического класса, он может создать объект нестатического внутреннего класса.
Если основной класс в доступе к членам статического внутреннего класса, он имеет два случая:
- Случай 1: для статических членов, он может использовать имя класса статического внутреннего класса
- Случай 2: Для нестатических членов, он может создать экземпляр статического внутреннего класса.
Обсуждение вложенных классов...
Разница заключается в том, что объявление вложенного класса, которое также является статическим, может создаваться вне внешнего класса.
Когда у вас есть объявление вложенного класса, которое не является статическим, Java не позволит вам создать его экземпляр, кроме как через включающий класс. Объект, созданный из внутреннего класса, связан с объектом, созданным из внешнего класса, поэтому внутренний класс может ссылаться на поля внешнего.
Но если она статическая, то ссылка не существует, внешние поля не могут быть доступны (кроме как через обычную ссылку, как любой другой объект), и поэтому вы можете создать экземпляр вложенного класса самостоятельно.
Внутренний класс не может быть статическим, поэтому я собираюсь переформулировать ваш вопрос как "В чем разница между статическими и нестатическими вложенными классами?".
как вы сказали здесь, внутренний класс не может быть статическим... я нашел код ниже, который получает статический.... причину? или что правильно....
Да, в семантике статического вложенного типа нет ничего, что помешало бы вам сделать это. Этот фрагмент работает нормально.
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
это код, размещенный на этом сайте...
на вопрос ---> Может ли статический вложенный класс быть установлен несколько раз?
ответ был --->
Теперь, конечно, вложенный тип может выполнять собственный контроль экземпляра (например, частные конструкторы, шаблон синглтона и т. Д.), Но это не имеет никакого отношения к тому факту, что это вложенный тип. Кроме того, если вложенный тип является статическим перечислением, вы, конечно, не можете создать его экземпляр.
Но в целом, да, статический вложенный тип может быть создан несколько раз.
Обратите внимание, что технически статический вложенный тип не является "внутренним" типом.
Статический внутренний класс: может объявлять статические и нестатические члены, но может обращаться только к статическим членам своего родительского класса.
Нестатический внутренний класс: может объявлять только нестатические члены, но может обращаться к статическим и нестатическим членам своего родительского класса.
Статический вложенный класс взаимодействует с членами экземпляра своего внешнего класса (и других классов), как и любой другой класс верхнего уровня. По сути, статический вложенный класс является поведенческим классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.