2016-07-13 6 views
-2

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

public class EmptyBracesWithinClass { 
    public static void main(String[] args) { 
     EmptyBraces eb = new EmptyBraces(); 
     System.out.println("SYSO within main() method"); 
    } 
} 

class EmptyBraces { 
    { 
     System.out.println("SYSO within empty braces"); 
    } 

    public EmptyBraces() { 
     System.out.println("SYSO within constructor() method"); 
    } 
} 

консоли:

SYSO within empty braces 
SYSO within constructor() method 
SYSO within main() method 

вопрос здесь, почему бы кусок кода в пустых скобках получить выполнен первым во время создания экземпляра объекта из EmptyBraces класса (хотя он никогда не объявлен STATIC явно)?

+1

В следующий раз: выполните некоторые предварительные исследования; и серьезно; Я не понимаю, почему люди выказывают очевидный дубликат ... – GhostCat

+2

для получения дополнительной информации (http://stackoverflow.com/questions/12550135/static-block-vs-initializer-block-in-java) – emotionlessbananas

+0

Примечание: Это не статический инициализатор, а инициализатор экземпляра. – Jesper

ответ

5

the piece of code within the empty braces называется блок инициализации экземпляра. Он запускается перед телом конструктора (и после выполнения конструктора суперкласса) всякий раз, когда создается экземпляр класса.

1

Это потому, что до того, как метод печати был исключен из EmptyBracesWithinClass, вы вызываете EmptyBraces, создавая его экземпляр. поэтому сначала запускается статический блок инициализатора, а затем запускается конструктор.

+0

вы должны прочитать это сначала (http://stackoverflow.com/questions/12550135/static-block-vs-initializer-block-in-java) – emotionlessbananas

+0

спасибо за ваше указание. но я имею в виду статический блок инициализатора точно. Я отредактировал свой ответ, еще раз спасибо. –