SCJP Sierra Bates Глава 2 Вопрос 2 Вызовы конструктора по умолчанию

#scjp #default-constructor

#scjp #default-constructor

Вопрос:

Справочная информация У меня есть запрос относительно вопросов из книги Sierra amp; Bates, SCJP v6. А именно глава 2 вопрос 2. Полученный ответ заключается в том, что «компиляция завершается с ошибкой». Однако, когда я попробовал это в neBeans, код скомпилировался и запустился без ошибок. Он также вернул вывод «D», который не был одной из альтернатив. На различных форумах есть несколько других обсуждений по этому же вопросу, касающихся необходимости вставки super () и т.д. Однако, похоже, никто не распознал, что он может компилироваться.

Вопрос 1. Я ожидал, что конструктор «Bottom2(String s) … вызвал суперконструктор «Top (String s) …». В этом случае результатом было бы «BD» (что, кстати, является вариантом для вопроса. Почему «Top (String s) …» не вызывается. 2. Поскольку существует конструктор Top, будет ли по-прежнему неявно создан конструктор компилятора по умолчанию. то есть фактически это конструктор «Top() {}», который может быть вызван с помощью «Bottom2(String s)». Я понял, что это происходит не так — т.Е. компилятор создает это значение по умолчанию только в том случае, если другой конструктор не создан. 3. Есть ли ошибка в этом вопросе, или это перенесенный вопрос из версии Java 5, и каким-то образом в Java 6 компилятор теперь может справиться с этим. 4. Могут ли у NetBeans быть средства для «решения» проблемы с компилятором. Это довольно важно, поскольку я изучаю SCJP и нахожу, что не все вопросы могут быть продублированы в NetBeans. В этом случае я могу научиться верить, что какой-то код работает, когда (для целей экзамена) это не так.

Код включен для удобства использования.

 class Top { 
    public Top(String s) { System.out.print("B"); } 
} 

public class Bottom2 extends Top { 
    public Bottom2(String s) { System.out.print("D"); } 
    public static void main(String [] args) { 
        new Bottom2("C"); 
        System.out.println(" "); 
    }
}
  

Комментарии:

1. Вы абсолютно уверены, что ввели код точно так, как он представлен в книге?

Ответ №1:

Top не имеет конструктора по умолчанию (конструктор по умолчанию — это общедоступный конструктор с пустым списком аргументов. Следовательно, конструктор Bottom2 должен явно вызвать суперконструктор (и передать его аргумент), но не делает этого, и, следовательно, компиляция завершается неудачей.

Действительно, eclipse helios говорит:

Неявный суперконструктор Top() не определен. Необходимо явно вызвать другой конструктор

и javac говорит:

 cannot find symbol
symbol  : constructor Top()
location: class tools.Top
    public Bottom2(String s) { System.out.print("D"); }
                             ^
  

Вы действительно уверены, что пробовали тот же код в Netbeans?

Комментарии:

1. Привет, спасибо, что подняли проблему с кодом. Я вернулся и проверил это снова. В ходе моих экспериментов с последовательностью я каким-то образом удалил «extends Top» в 5-й строке. Научи меня заниматься поздно ночью, после того как жена и дети легли спать. После повторной вставки он не может скомпилироваться, поскольку для правильной работы ему, очевидно, потребуется конструктор по умолчанию «public Top(){};».