Сомнение, основанное на программе в SCJP (экзамен 310-065) - PullRequest
2 голосов
/ 13 июля 2010
class Building{
    Building(){
        System.out.print("b ");
    }
    Building(String name){
        this();
        System.out.print("bn "+name);
    }
}
public class House extends Building{
    House(){
        System.out.print("h ");
    }
    House(String name){
        this();
        System.out.print("hn "+name);
    }
    public static void main(String[] args){
        new House("x ");
    }
}

Я ДУМАЛ, ЧТО ВЫХОД ДОЛЖЕН БЫТЬ bn h hn x .Но на выходе получается чч хн х .

Я в замешательстве.Как этот вывод приходит.Помоги мне

Ответы [ 2 ]

3 голосов
/ 13 июля 2010

Вы, вероятно, думаете о неявном вызове super(), который Java вставляет в конструкторы.Но помните, что Java делает это только тогда, когда это необходимо - то есть, когда вы сами не вызываете другой конструктор.Когда вы вызываете this() в конструкторе House с одним аргументом, вы уже переходите к другому конструктору, поэтому Java не вставляет туда вызов super().конструктор с нулевым аргументом House(), вы не начинаете его с вызова this(...) или super(...).Таким образом, в этом случае Java вставляет super() для вас.

В итоге, Java никогда не вызывает Building(String).Во время инициализации объекта вызывается только один конструктор суперкласса, и это без аргументов.

0 голосов
/ 13 июля 2010

Порядок цепочки вызовов конструктора: 1. Дом (строковое имя) 2. Дом () 3. Здание ()

, выдающее bh hn

с последующим оператором printf.х, в результате чего получается окончательный результат ** чч хн х **

Это потому, что;1. Существует явный вызов конструктора this () в House (String name).Это позволяет избежать неявного вызова super (), который вставляет Java.2. В конструкторе House () нет явного вызова конструктора, в результате чего Java вставляет неявный вызов в конструктор суперкласса Building ().Это печатает ** b ** перед оператором printf ** h ** в House ().

...