2014-11-04 11 views
2

я работал на SCJP6 отвалы, когда я нашел это запутанное упражнение:почему компиляция не выполняется для этого примера

С учетом классов, определенное в двух разных файлах:

package packageA; 

public class Message { 

String getText() { return “text”; } 

} 

И:

package packageB; 

public class XMLMessage extends packageA.Message { 

String getText() { return “<msg>text</msg>”;} 

public static void main(String[] args) { 

System.out.println(new XMLMessage().getText()); 

} 

} 

Каков результат выполнения XMLMessage.main?

A. text 

B. Compilation fails. 

C. <msg>text</msg> 

D. An exception is thrown at runtime. 

Ответ был: B, но я не понимаю, почему; Я думаю, что ответ должен быть C.

+3

Ну вы * попробуйте * скомпилировать образец кода? –

+0

Вы пытались запустить его? –

+0

Вы уверены, что нет '@ Override' где-то в строке 2.5? Потому что он компилирует и печатает ' текст'. – zapl

ответ

2

Если код, который вы отправили это тот, который находится в книге, правильный ответ, как вы упомянули это C, позвольте мне объяснить, почему.

Опять же, если вы скопировали код, как это показано в книге, когда вы делаете, следующую строку:

String getText() { return “<msg>text</msg>”;} 

Ее не переопределение метода GetText() в классе packageA.Message но объявляющих новый , который будет доступен для экземпляров XMLMessage в пакетеB.

Это было бы иначе, если основной метод что-то вроде:

public static void main(String[] args) { 

    Message message = new XmlMessage(); 
    System.out.println(message.getText()); 
} 

В этом случае есть ошибка компиляции с Message.getText() методы не подвергается воздействию извне пакета.

+0

Почему его просто предупреждение? даже больше, я могу запустить его, и он создает текст Tarik

+0

Пока вы объявляете экземпляр XMLMessage и получаете доступ к методам getText() в пакете B (в этом случае), код действителен, а вывод будет « text », то, что очень важно для вас заметить, это то, о чем я упоминал ранее, это не переопределяет packageA.Message.getText(). – jbarrueta

+0

благодарит jbarrueta за все объяснение, и я согласен с вами. Тем не менее, мне действительно интересно, почему в книге дампов они сказали, что B - правильный ответ, вы думаете, что на реальном экзамене (SCJP 6) ответ будет «C», или они могут делать такие ошибки? – Tarik

1

Нельзя переопределить метод по умолчанию для пакета, поскольку он не отображается в другом пакете. В вашем примере метод getText() в классе Message доступен только для членов packageA. Method does not override package visible method in Eclipse

+0

спасибо за ваш ответ, но я думал, что XMLMessage не может увидеть метод в packageA.Message он может определить его как новый метод. Почему это просто предупреждение? – Tarik

+0

почему это просто предупреждение? даже больше, я могу запустить его, и он производит текст Tarik

+0

, когда я компилирую и запускаю код, я не вижу никаких предупреждений (не в моей IDE в любом случае). jbaruetta правильно - если образец кода попытался ссылаться на метод getText() из Message вместо этого, это было бы ошибкой компиляции.Мне не удалось увидеть, что образец кода, на который ссылается getText из XMLMessage(), предполагая, что ваш прогноз B был правильным, начинался с :) – algorithmic

1

Метод String getText() { return “text”; } есть с пакетом (по умолчанию) scope. И, следовательно, это не видно за пределами пакета packageA.

поэтому невозможно переопределить метод в классе XMLMessage, который находится за пределами упаковки A.

Вы можете узнать здесь basics of method overloading and overriding

+0

спасибо за ваш ответ, но я думал, что XMLMessage не может видеть метод в packageA.Message он может определить его как новый метод. почему это просто предупреждение? еще больше, я могу запустить его и произвести текст Tarik

 Смежные вопросы

  • Нет связанных вопросов^_^