2010-04-16 4 views
5

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

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

ответ

17

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

+0

+1 Был готов опубликовать то же самое. – mikej

+0

спасибо Dav, но когда происходит «загрузка класса»? после компиляции или когда я хочу сделать экземпляр из класса? –

+0

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

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

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

3

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

1

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

2

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

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

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; 
    } 

    [...] 
} 

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

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