2013-09-04 2 views
3
class prog 
{ 
    static 
    { 
     System.out.println("s1"); 
    } 
    prog() 
    { 
     System.out.println("s2"); 
    } 

    public static void main(String...args) 
    { 
     prog p = new prog(); 
    } 
} 

Выходстатический блок инициализации против конструктора Java

s1 
s2 

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

В чем причина этого?

ответ

8

Строго говоря, static initializers выполняются, когда the class is initialized.

Class loading - отдельный шаг, который происходит чуть раньше. Обычно класс загружается, а затем сразу инициализируется, поэтому время на самом деле не имеет большого значения в большинстве случаев. Но это - можно загрузить класс без его инициализации (например, используя the three-argument Class.forName() variant).

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

5

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

20

Static block выполняется один раз в то время класса загрузкой & инициализации с помощью виртуальной машины Java и конструктор вызывается в каждый раз при создании экземпляра этого класса.

Если вы измените свой код -

public static void main(String...args){ 
    prog p = new prog(); 
    prog p = new prog(); 
} 

вы получите выход -

s1 // static block execution on class loading time 
s2 // 1st Object constructor 
s2 // 2nd object constructor 

Что проясняет больше.

0

Статический блок один исполняемый блок раз .. он выполняет во время загрузки классов ..

когда объект создается для конструктора класса выполняется ..

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