当我发现这个令人困惑的练习时,我正在研究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。
答案 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
中的方法。