为什么编译失败的例子

时间:2014-11-04 17:40:33

标签: java inheritance polymorphism scjp ocpjp

当我发现这个令人困惑的练习时,我正在研究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 :(得分:2)

如果您发布的代码是书中的代码,正如您所提到的正确答案是C,让我解释原因。

同样,假设您复制了本书中显示的代码,请执行以下操作:

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

它没有覆盖packageA.Message类中的getText()方法,但是声明了一个新方法,可以在packageB中为XMLMessage实例访问它。

如果主要方法类似于:

,则会有所不同
 public static void main(String[] args) {

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

在这种情况下,由于Message.getText()方法未在包外公开,因此存在编译错误。

答案 1 :(得分:1)

无法覆盖包默认方法,因为它在另一个包中不可见。 在您的示例中,类Message中的方法getText()仅对packageA的成员可见。 Method does not override package visible method in Eclipse

答案 2 :(得分:1)

方法String getText() { return “text”; }具有包(默认)范围。因此它在包packageA之外是不可见的。

因此无法覆盖packageA之外的类XMLMessage中的方法。

您可以在此处了解basics of method overloading and overriding