2

当我发现这个令人困惑的练习时,我正在处理 SCJP6 转储:

给定在两个不同文件中定义的类:

package packageA;

public class Message {

String getText() { return “text”; }

}

和:

package packageB;

public class XMLMessage extends packageA.Message {

String getText() { return “&lt;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。

4

3 回答 3

2

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

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

String getText() { return “&lt;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() 方法没有暴露在包之外。

于 2014-11-04T18:02:18.510 回答
1

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

于 2014-11-04T17:44:52.403 回答
1

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

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

您可以在此处学习方法重载和覆盖的基础知识

于 2014-11-04T17:53:23.317 回答