Java 为什么该示例的编译失败
当我在处理SCJP6转储时,发现了这个令人困惑的练习: 在两个不同文件中定义的给定类:Java 为什么该示例的编译失败,java,inheritance,polymorphism,scjp,ocpjp,Java,Inheritance,Polymorphism,Scjp,Ocpjp,当我在处理SCJP6转储时,发现了这个令人困惑的练习: 在两个不同文件中定义的给定类: package packageA; public class Message { String getText() { return “text”; } } 以及: 执行XMLMessage.main的结果是什么 A. text B. Compilation fails. C. <msg>text</msg> D. An exception is thrown at ru
package packageA;
public class Message {
String getText() { return “text”; }
}
以及:
执行XMLMessage.main的结果是什么
A. text
B. Compilation fails.
C. <msg>text</msg>
D. An exception is thrown at runtime.
答案是:B,但我不明白为什么;我认为答案应该是C。不能覆盖包默认方法,因为它在另一个包中不可见。 在您的示例中,类消息中的方法getText仅对packageA的成员可见。 方法字符串getText{return“text”;}具有包的默认作用域。因此,它在包装外不可见 因此,不可能重写packageA之外的XMLMessage类中的方法
您可以在此处学习如果您发布的代码是书中的代码,您提到的正确答案是C,让我解释一下原因 同样,假设您复制了书中所示的代码,那么下面一行:
String getText() { return “<msg>text</msg>”;}
在本例中,由于Message.getText方法未在包外公开,因此存在编译错误。您是否尝试编译示例代码?是否尝试运行它?是否确定第2.5行的某个地方没有@Override?因为它确实编译和打印文本。不,我只是编译它,它编译时带有警告,所以我想知道为什么它只有警告而不是编译器错误。我只是运行它,它运行得很好谢谢你的回答,但我认为,由于XMLMessage无法在packageA.Message中看到该方法,它可以像定义一个新方法一样定义它。为什么只是警告?为什么只是警告?更重要的是,我可以运行它并生成文本。当我编译和运行代码时,我在IDE中看不到任何警告。jbaruetta是正确的-如果代码示例试图引用方法getText from Message,那么这将是一个编译错误。我没有看到代码示例引用了XMLMessage中的getText,假设您对答案B的预测一开始是正确的:谢谢您的回复,但我认为因为XMLMessage在packageA.Message中看不到该方法,所以它可以将其定义为一个新方法。为什么这只是一个警告?更重要的是,我可以运行它并生成文本为什么它只是一个警告?更重要的是,我可以运行它并生成文本,只要您声明一个XMLMessage实例并访问packageB中的getText方法,这种情况下代码是有效的,输出是文本,这对您来说非常重要,我前面提到过,这并没有覆盖packageA.Message.getText。谢谢jbarrueta的所有解释,我同意你的观点。然而,我真的很想知道为什么在dumps的书中他们说B是正确的答案,你认为在真正的SCJP 6考试中答案会是C,或者他们可能会犯这样的错误?我刚刚看到在dumps的中文版本中,答案是C:
String getText() { return “<msg>text</msg>”;}
public static void main(String[] args) {
Message message = new XmlMessage();
System.out.println(message.getText());
}