2014-11-04 102 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

你是否试过*编译示例代码? – 2014-11-04 17:44:09

+0

您是否尝试过运行它? – 2014-11-04 17:54:52

+0

你确定在第2.5行的某处没有'@ Override'吗?因为它编译和打印'文本'。 – zapl 2014-11-04 18:01:19

回答

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编译错误()方法是不包外部露出。

+0

为什么它只是一个警告?甚至更多,我可以运行它,只要你声明XMLMessage例如,它产生文本 Tarik 2014-11-04 18:05:29

+0

和内packageB访问的getText()方法(它是如此)的代码是有效的,输出为“文本 “,这对你来说很重要,这是我之前提到的,这并不是重写packageA.Message.getText()。 – jbarrueta 2014-11-04 19:19:06

+0

感谢jbarrueta所有的​​解释,我同意你的看法。然而,我真的想知道为什么在倾销书中他们说B是正确的答案,你认为在真正的考试(SCJP 6)中答案是“C”,否则他们可能会犯这样的错误? – Tarik 2014-11-05 21:01:58

1

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

+0

感谢您的答复,但我认为,因为XMLMessage不能看到方法在packageA.Message中它可以将它定义为一种新方法。 为什么它只是一个警告? – Tarik 2014-11-04 17:56:53

+0

为什么它只是一个警告?甚至更多,我可以运行它,它产生文本 Tarik 2014-11-04 18:05:46

+0

当我编译和运行代码,我看到没有警告(不是在我的IDE反正)。 jbaruetta是正确的 - 如果代码示例试图从Message引用方法getText(),那么它将会是一个编译错误。我没有看到代码示例引用了XMLMessage()中的getText(假设您对答案B的预测是正确的:) – algorithmic 2014-11-04 20:06:18

1

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

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

您可以了解basics of method overloading and overriding这里

+0

感谢您的回复,但我认为XMLMessage无法看到packageA.Message中的方法可以将其定义为一种新方法。为什么它只是一个警告? 甚至更​​多,我可以运行它,它产生文本 Tarik 2014-11-04 18:02:16

相关问题