java - 为什么该示例的编译失败

标签 java inheritance polymorphism scjp ocpjp

当我发现这个令人困惑的练习时,我正在处理 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/

相关文章:

java - ldap 连接错误,获取详细子错误代码

C++ 结构继承

C++ 引用和接口(interface)指针之间的不同行为

javascript - 扩展 javascript "class"(对象)

c++ - 在 C 中实现多态性是否需要不兼容的指针分配

java - 在 Java 桌面应用程序中实现 'Send Feedback' 功能

java - 使用java源码调试Android库项目

c++ - 向下转型和虚函数

java - 前缀树问题

c++ - 将派生对象列表传递给期望获得基对象列表的函数