SCJP Sierra Bates Глава 2 Вопрос 2 Вызовы конструктора по умолчанию - PullRequest
0 голосов
/ 18 апреля 2011

Справочная информация У меня есть вопрос относительно вопросов из книги Sierra & 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 голос
/ 18 апреля 2011

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

Действительно, гелиос затмения говорит:

Неявный супер-конструктор Top () не определен. Должен явно вызывать другой конструктор

и javac говорит:

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

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

...