#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(){};».