порядок инициализации в Java - PullRequest
5 голосов
/ 16 апреля 2010

Я хочу спросить, почему java инициализирует статические объекты перед нестатическими объектами?
в этом примере b3 будет инициализирован после b4 и b5:

class Cupboard { 
    Bowl b3 = new Bowl(3); 
    static Bowl b4 = new Bowl(4); 
    Cupboard() {}
    static Bowl b5 = new Bowl(5); 
}

Ответы [ 5 ]

17 голосов
/ 16 апреля 2010

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

3 голосов
/ 16 апреля 2010

Потому что класс инициализируется до того, как экземпляр. Когда класс загружен, Java запускает любые статические блоки и инициализирует статические переменные. Однако нестатические экземпляр переменные не создаются и не инициализируются до тех пор, пока не будет создан экземпляр .

2 голосов
/ 16 апреля 2010

Статические переменные инициализируются при загрузке класса.

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

class Foo
{
    private static final Foo FOO_BAR = new Foo("bar");
    private static final Foo FOO_BAZ = new Foo("baz");

    private final String name;

    public Foo(String n)
    {
        name = n;
    }

    [...]
}

Здесь имя в первом случае инициализируется как «bar» до инициализации FOO_BAZ.

2 голосов
/ 16 апреля 2010
  • static переменные инициализируются во время загрузки класса.

  • переменные экземпляра (нестатические) инициализируются после создания объекта этого класса, то есть после загрузки класса.

1 голос
/ 16 апреля 2010

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

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