当我发现这个令人困惑的练习时,我正在处理 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。
最佳答案
如果您发布的代码是书中的代码,那么您提到的正确答案是 C,让我解释一下原因。
同样,假设您复制了本书中显示的代码,即以下行:
String getText() { return “<msg>text</msg>”;}
它没有覆盖 packageA.Message 类中的 getText() 方法,而是声明了一个新方法,可以为 packageB 中的 XMLMessage 实例访问。
如果 main 方法是这样的,这会有所不同:
public static void main(String[] args) {
Message message = new XmlMessage();
System.out.println(message.getText());
}
在这种情况下存在编译错误,因为 Message.getText() 方法未在包外公开。
关于java - 为什么该示例的编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741526/