Вопрос о статических переменных-членах - PullRequest
2 голосов
/ 01 июля 2011

В следующем коде я предполагаю, что переменная-член mBar будет создана только после первой конструкции Foo объекта ... и что эта mBar реализация будет доступна всем будущим Foo объектов, но конструктор Bar() больше не будет вызываться. Это точно?

public class Foo {
  private static Bar mBar = new Bar();

  public Foo() {

  }

Ответы [ 3 ]

6 голосов
/ 01 июля 2011

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

4 голосов
/ 01 июля 2011

Почти, он будет создан при первой загрузке class Foo.Поэтому, если вы вызовете Foo.mBar (если он был публичным), вы получите экземпляр bar, хотя экземпляры Foo не были созданы.

0 голосов
/ 01 июля 2011

Ваши предположения в основном верны. mBar инициализируется только один раз для всех экземпляров класса (в том же процессе). Обратите внимание, что это не мешает другим классам вызывать конструктор Bar ...

Редактировать: как указано в комментариях, это не обязательно будет при первом построении объекта Foo; это первая исполняемая ссылка на объект Foo, которая заставит загрузчик классов инициализировать статические члены (таким образом вызывая Bar ()).

...