В чем разница между статическим и нестационарным внутренним классом?Java: статический и внутренний класс
ответ
Внутренний класс, by definition, не может быть статическим, поэтому я собираюсь переформулировать ваш вопрос как «В чем разница между статическими и нестатическими вложенными классами?»
Нестатический вложенный класс имеет полный доступ к членам класса, внутри которого он вложен. Статический вложенный класс не имеет ссылки на экземпляр вложенности, поэтому статический вложенный класс не может вызывать нестатические методы или доступ к нестатическим полям экземпляра класса, в котором он вложен.
Давайте посмотрим на источник мудрости для таких вопросов: Джошуа Блоха Эффективное Java:
Технически, нет такого понятия, как статический внутренний класс. Согласно Эффективная Java, правильная терминология - статический вложенный класс . Нестатический вложенный класс действительно является внутренним классом, а также анонимными классами и локальными классами.
А теперь цитирую:
Каждый экземпляр нестатического [вложенной] класс неявно связан с охватывающему экземпляра его содержащего класс ... Можно вызывать методы на охватывающий экземпляр.
Статический вложенный класс не имеет доступа к прилагаемому экземпляру. Он также использует меньше места.
Я просто читал его. Пункт 22: Использовать классы статических членов над нестатическими –
Также Блох отмечает, что ссылка на экземпляр окружения в ненужном нестационарном внутреннем классе может предотвратить сбор мусора, если он сохранен. –
Когда один предпочтительнее другого? –
Обсуждая вложенных классов ...
Разницы заключается в том, что декларация Вложенного класса, который также статический может быть реализована вне класса вмещающего.
Если у вас есть объявление вложенного класса, то есть не статический, Java не позволит вам создать экземпляр, кроме как через класс включения. Объект, созданный из внутреннего класса, связан с объектом, созданным из внешнего класса, поэтому внутренний класс может ссылаться на поля внешнего.
Но если он статичен, ссылка не существует, внешние поля не могут быть доступны (за исключением обычной ссылки, как и любой другой объект), и поэтому вы можете создать экземпляр вложенного класса самостоятельно.
статический внутренний класс: может объявлять статические & нестационарные элементы, но может иметь доступ только к статическим членам класса его родителей.
нестатический внутренний класс: может объявлять только нестатические элементы, но может обращаться к статическому и нестационарному члену его родительского класса.
Нет «статического внутреннего класса», и (нестатический) внутренний класс может объявлять какие-то статические члены. [JLS 8.1.3] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3 «Внутренние классы и экземпляры Enclosing Instances»): «Внутренний класс является вложенным класс, который явно или неявно объявлен статическим. [...] Внутренние классы не могут объявлять статические члены, если они не являются постоянными полями времени компиляции (§15.28) .' –
Статический вложенный класс взаимодействует с членами экземпляра его внешнего класса (и других классов), как и любой другой класс верхнего уровня. По сути, статический вложенный класс поведенчески является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки.
Существует два различия между статическими внутренними и нестационарными внутренними классами.
В случае объявления члены полей и методов, нон статический внутренний класс не может иметь статические поля и методы. Но в случае статического внутреннего класса могут иметь статические и нестатические поля и метод.
Экземпляр нестационарного внутреннего класса создается с ссылкой объекта внешнего класса, в котором он определен, это означает, что он имеет прилагаемый экземпляр. Но экземпляр статического внутреннего класса - , созданный без ссылки класса 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();
}
}
Поскольку одного из них не существует, разница бесконечна. – EJP
Примеры действительно помогают =) – Micro
Решенный Оба сомнения (статический/нестатический) в одном примере, очень аккуратный! – user3833732
Внутренний класс не может быть статичным, поэтому я собираюсь изложить свой вопрос «В чем разница между статическими и не статическими вложенными классами?».
как у сказал здесь внутренний класс не может быть статическим ... я нашел ниже код, который ставится .... причина? или что правильно ....
Да, в семантике статического вложенного типа нет ничего, что помешало бы вам это сделать. Этот фрагмент отлично работает.
public class MultipleInner {
static class Inner {
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Inner();
}
}
}
это код размещен на этом сайте ...
на вопрос ---> Может ли статический вложенный класс инстанциируемые несколько раз?
ответ --->
Теперь, конечно, вложенный тип может сделать свой собственный контроль экземпляра (например, частные конструкторы, синглтон шаблон, и т.д.), но это не имеет ничего общего с тем, что это вложенное тип. Кроме того, если вложенный тип является статическим перечислением, вы, конечно, не можете его создать.
Но, в общем, да, статический вложенный тип может быть создан несколько раз.
Обратите внимание, что технически статический вложенный тип не является «внутренним» типом.
Статический внутренний класс не может получить доступ к нестационарным членам охватывающего класса. Он может напрямую обращаться к статическим членам (полем и методам экземпляра) того же класса, что и процедурный стиль получения значения без создания объекта.
Статический внутренний класс может объявлять как статические, так и нестатические элементы. Статические методы имеют доступ к статическим членам основного класса. Однако он не может получить доступ к нестационарным внутренним членам класса. Чтобы получить доступ к членам нестатического внутреннего класса, он должен создать объект нестатического внутреннего класса.
Нестатический внутренний класс не может объявлять статические поля и статические методы. Он должен быть объявлен как в статическом, так и в верхнем уровне. Вы получите эту ошибку, указав, что «статические поля объявляются только в статическом или верхнем уровне».
Нестатический внутренний класс может обращаться как к статическим, так и к нестационарным членам охватывающего класса в процедурный стиль получения значения, но не может обращаться к членам статического внутреннего класса.
Закрывающий класс не может обращаться к членам внутренних классов, пока не создаст объект внутренних классов. Если основной класс при доступе к членам нестатического класса может создать объект нестатического внутреннего класса.
Если основной класс доступа пользователей статического внутреннего класса имеет два случая:
- Case 1: Для статических членов, он может использовать имя класса статического внутреннего класса
- Случай 2: Для не -статические члены, он может создать экземпляр статического внутреннего класса.
Не могли бы вы исправить грамматику в таких местах, как «IF основной класс при доступе к членам нестатического класса» или «Если основной класс в доступе к членам статического внутреннего класса». Я понятия не имею, что вы там пытаетесь сказать. – nhahtdh
- 1. Внутренний статический класс в Java
- 2. Внутренний класс и статический контекст
- 3. внутренний класс и статический метод Java
- 4. Java Внешний класс расширяет статический внутренний класс
- 5. Статический внутренний класс компиляции
- 6. Статический вопрос внутренний класс в Java
- 7. Статический внутренний класс в python
- 8. Статический метод, возвращающий внутренний класс
- 9. фрагмент внутренний статический класс и Gradle вопросы
- 10. Нельзя импортировать статический внутренний класс?
- 11. статический внутренний класс и не статический внешний метод
- 12. статический внутренний класс и статический член класса разделяет SAME NAME?
- 13. Как подклассировать внутренний (статический) класс в Rhino?
- 14. Зачем и когда использовать статический внутренний класс или внутренний класс экземпляра?
- 15. Как построить (не статический) Java внутренний класс от Groovy
- 16. Core Java Том 1 глава 6 6.4.7 статический внутренний класс
- 17. статический внутренний класс в пользовательском диалоговом фрагменте?
- 18. класс java и статический метод
- 19. Как инициализируется рекурсивный внутренний статический класс?
- 20. Sonar Performance - статический внутренний класс Token Token
- 21. Статический внутренний класс соответствует внешним элементам класса
- 22. Статический внутренний класс против внутреннего класса Companion
- 23. Почему статический внутренний класс singleton thread safe
- 24. Почему я могу создать статический внутренний класс?
- 25. Правильная настройка Proguard держать статический внутренний класс
- 26. Java-интерфейс Внутренний класс
- 27. Java внутренний класс это
- 28. Java внутренний класс использования
- 29. Java singleton внутренний класс
- 30. Java anonymous внутренний класс
хороший ответ. доступ к статическим членам из экземпляров настолько нелогичен. доступ к статическим членам должен быть доступен только через 'SomeClass.StaticMember' или внутри' SomeClass', через 'StaticMember' (без' this.'), тогда мы не получили бы эти вопросы вообще. –
@Brandon: Когда вы говорите: «статический вложенный класс не может вызывать нестатические методы или доступ к нестатическим полям экземпляра класса, в котором он вложен». ... Это означает, что без создания объекта закрывающего класса? Поскольку, как я вижу, вложенный статический класс поведенчески является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки. Таким образом, должно быть возможно получить доступ к нестационарным элементам через объект. – Shatu