Зачем мне создавать экземпляр статического класса в Java? - PullRequest
2 голосов
/ 19 декабря 2011

В руководстве по Java сказано, что к статическим вложенным классам можно обращаться, используя имя включающего класса, например new EnclosingClassNameHere.StaticNestedClassNameHere ()

Почему я хочу создать экземплярстатический класс вообще?Может кто-нибудь объяснить, пожалуйста?

Ответы [ 3 ]

6 голосов
/ 19 декабря 2011

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

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

В вашем примере кода:

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

Вы создаете автономный экземпляр StaticNestedClass.

Если бы он не был статичным, вы бы не смогли этого сделать. Вы можете создавать экземпляры StaticNestedClass() только из экземпляра OuterClass.

Если вы переместили его в собственный файл .java, вы могли бы обработать его почти одинаково:

StaticNestedClass notNestedAnymore = new StaticNestedClass();

Что касается вашего реального вопроса: зачем вам создавать его экземпляр? По той же причине, по которой вы создаете экземпляры любого класса - он выполняет какую-то часть работы, которая вам нужна.

5 голосов
/ 19 декабря 2011

В этом коде нет ничего запутанного. Статический вложенный класс - это просто способ представить еще одно пространство имен.

Создавая статический вложенный класс, вы выражаете очень сильные отношения между внешним и внутренним классом. Обычно вложенный класс является помощником или частью внешнего класса. Например, когда вы создаете класс Tree, класс Node является хорошим кандидатом для вложенного статического класса. Tree.Node четко объясняет назначение класса Node.

Фактически, использование static ключевого слова соответствует полям static. В обоих случаях вы можете получить доступ к сущности static без экземпляра включающего класса. Когда речь идет о static классах, это в основном означает: « Я могу создать экземпляр этого статического вложенного класса без экземпляра внешнего класса ». По умолчанию (когда ключевое слово static не используется) вложенный класс становится внутренним классом . В этом случае вы не можете просто написать:

new OuterClass.StaticNestedClass();

Вместо этого вам необходимо передать OuterClass экземпляр с немного неясным синтаксисом:

OuterClass outerClassInstance = new OuterClass();
outerClassInstance.new InnerClass();

К счастью, когда new InnerClass() выполняется внутри и OuterClass тела, this неявно используется как включающий экземпляр.

1 голос
/ 19 декабря 2011

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

class A{
   private int a = 3;
   class Inner{
      Inner(){

         System.out.println(a);//also A.this.a
      }
   }
   static class StaticInner{
       StaticInner(){
          System.out.println(a);//FAILS
       }

   }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...