2009-08-30 2 views

ответ

472

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

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

+3

хороший ответ. доступ к статическим членам из экземпляров настолько нелогичен. доступ к статическим членам должен быть доступен только через 'SomeClass.StaticMember' или внутри' SomeClass', через 'StaticMember' (без' this.'), тогда мы не получили бы эти вопросы вообще. –

+4

@Brandon: Когда вы говорите: «статический вложенный класс не может вызывать нестатические методы или доступ к нестатическим полям экземпляра класса, в котором он вложен». ... Это означает, что без создания объекта закрывающего класса? Поскольку, как я вижу, вложенный статический класс поведенчески является классом верхнего уровня, который был вложен в другой класс верхнего уровня для удобства упаковки. Таким образом, должно быть возможно получить доступ к нестационарным элементам через объект. – Shatu

105

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

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

А теперь цитирую:

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

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

+10

Я просто читал его. Пункт 22: Использовать классы статических членов над нестатическими –

+5

Также Блох отмечает, что ссылка на экземпляр окружения в ненужном нестационарном внутреннем классе может предотвратить сбор мусора, если он сохранен. –

+1

Когда один предпочтительнее другого? –

10

Обсуждая вложенных классов ...

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

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

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

3

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

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

+3

Нет «статического внутреннего класса», и (нестатический) внутренний класс может объявлять какие-то статические члены. [JLS 8.1.3] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3 «Внутренние классы и экземпляры Enclosing Instances»): «Внутренний класс является вложенным класс, который явно или неявно объявлен статическим. [...] Внутренние классы не могут объявлять статические члены, если они не являются постоянными полями времени компиляции (§15.28) .' –

3

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

49

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

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

  2. Экземпляр нестационарного внутреннего класса создается с ссылкой объекта внешнего класса, в котором он определен, это означает, что он имеет прилагаемый экземпляр. Но экземпляр статического внутреннего класса - , созданный без ссылки класса 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(); 
    } 
} 
+0

Поскольку одного из них не существует, разница бесконечна. – EJP

+3

Примеры действительно помогают =) – Micro

+0

Решенный Оба сомнения (статический/нестатический) в одном примере, очень аккуратный! – user3833732

4

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

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

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

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

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

на вопрос ---> Может ли статический вложенный класс инстанциируемые несколько раз?

ответ --->

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

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

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

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

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

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

  4. Нестатический внутренний класс может обращаться как к статическим, так и к нестационарным членам охватывающего класса в процедурный стиль получения значения, но не может обращаться к членам статического внутреннего класса.

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

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

    • Case 1: Для статических членов, он может использовать имя класса статического внутреннего класса
    • Случай 2: Для не -статические члены, он может создать экземпляр статического внутреннего класса.
+0

Не могли бы вы исправить грамматику в таких местах, как «IF основной класс при доступе к членам нестатического класса» или «Если основной класс в доступе к членам статического внутреннего класса». Я понятия не имею, что вы там пытаетесь сказать. – nhahtdh

Смежные вопросы