2016-06-12 2 views
0

обнаружил в моем собственном коде инструкцию, которая выглядит как конструктор для экземпляра объекта, но на самом деле это не так. Я полностью забыл, где я взял образец такого утверждения, как для печати «Привет» ниже, но он работает как конструктор, а это, вероятно, нет. этот кодКонструктор-подобный оператор в Java для вызова супер

public class TestSet { 
    String hi="Hi"; 
    public TestSet(){ 
     System.out.println("Bye"); 
    } 
    { 
     System.out.println(hi); 
    } 

    public static void main(String s[]){ 
     new TestSet(); 
    } 
} 

фактически печатает «Привет» и «Bye» aaaand, если TestSet бы суперкласса, а затем положить «супер» в «Привет» кусок кода не будет работать. так что это? Я пытался использовать Google, но сложно сформулировать запрос. спасибо!

+0

Hi is static ;-) –

+0

@StephanBijzitter no. Это не. –

+0

НЕТ! Я могу изменить свой тест, чтобы подчеркнуть, что –

ответ

2

Вывод, который печатает «Привет», находится в блоке инициализатора экземпляра. Этот блок копируется в начало каждого конструктора вашего класса и выполняется до тела конструктора, но после выполнения конструктора суперкласса. Поэтому new TestSet(); печатает Hi, за которым следует Bye, но вы не можете добавлять вызовы к конструктору суперкласса (super()) в блок инициализатора экземпляра.

+0

Я смущен, как это могло быть, что супер constrктор вызвал раньше, а затем вызвал блок экземпляра, если, например, я неявно назову «супер» из моего конструктора. спасибо за то, что вы назвали это заявление :) –

+0

Я попытался добавить родительский класс, и он работает точно так же, как вы описали –

+1

@ Павел Конструктор суперкласса всегда вызывается (явно или неявно) из любого конструктора (если только этот конструктор не вызывает другой конструктор используя 'this()'), и он вызывается перед кодом любого блока инициализатора экземпляра. Код блока инициализатора экземпляра вызывается перед телом конструктора (который не включает вызов конструктора суперкласса). – Eran

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