SCJP v6 (Сьерра, Бейтс) Глава 2, Вопрос 12 Интерпретация вызовов конструктора - PullRequest
0 голосов
/ 17 апреля 2011

Могу ли я оставить отзыв об этом

Учитывая, что "new House (" x ")" отправляет строку, я ожидал, что конструктор "House (String name)" вызвал бы конструктор суперкласса Building«Здание (строковое имя)».В этом случае ответ был бы "bn xh hn x".Однако ответ «bh hn x» (и да, он действительно работает с этим выводом).

Вопросы 1. Кроме вызова «new Building (« string_value »)» »возникла бы ситуация, когда Хаусвызывать конструктор "Building (String name)"?(т. е. кроме дополнительного кода в конструкторах House? 2. Почему вызывается конструктор Building без аргумента, а не перегруженный конструктор Building (String name)? Что я смотрю, так это возможность, что может быть много конструкторов Building иможет возникнуть необходимость вызывать конкретные супер-конструкторы из подклассов. Как убедиться, что конструктор (с двумя или более вариантами) называется?

Код включен для удобства ссылок.

Ответэто "чч хн х"

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 a[]) {
        new House("x "); }
}

С уважением, Скотт

Ответы [ 2 ]

0 голосов
/ 18 апреля 2011

При наследовании от другого класса вы должны вызывать super () в своем конструкторе. Если вы этого не сделаете, компилятор вставит этот вызов для вас, как вы можете видеть.

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

Ниже приведен порядок выполнения вашей программы:

  1. новый дом ("х"); // вызов в main это вызовет тот же конструктор класса по умолчанию из-за this (), как вы уже знали, что первый оператор должен быть this () или super (), если есть

  2. Вызов this () в конструкторе выше выполняет конструктор House (). Теперь в House () нет вызова this (), поэтому компилятор устанавливает по умолчанию super (), который вызовет конструктор по умолчанию для базового класса, и

отсюда вывод: b h hn x

0 голосов
/ 18 апреля 2011

Если не предоставлен явный вызов конструктора суперкласса, и также не предусмотрен вызов конструктора в том же классе, конструктор суперкласса no-args вызывается всегда .Так устроен Java, и JVM будет слишком сложно и неэффективно записывать, кто был первым вызванным конструктором, и пытаться сопоставить его с конструктором суперкласса.

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

super(foo,bar);
...