在学习OCJP时,我遇到了令我惊讶的包裹问题。 我在自己的包A和B中分别有两个简单的类Message和New Message,如下所示:
package A;
public class Message
{
String getText()
{
return "text";
}
}
包类B中的NewMessage类和A:
的子类package B;
public class NewMessage extends A.Message
{
String getText() {
return "New Message";
}
public static void main(String[] args)
{
System.out.println(new NewMessage().getText());
}
}
我编译为:
javac -d . Message.java
javac -d . NewMessage.java
并以:
运行java B.NewMessage
并打印
New Message
通过关注此叠贴
Can a private method in super class be overriden in the sub-class?
我尝试用@Override
标记NewMessage的方法并编译它,这给了我以下错误:
NewMessage.java:4: error: method does not override or implement a method from a supertype
@Override
^
这意味着我没有覆盖getText()
方法。
有人可以向我解释这里发生了什么吗?这种情况类似于我链接的帖子中的私有方法覆盖的情况吗?
答案 0 :(得分:0)
我认为这个问题的答案有你想要的:
In Java, difference between default, public, protected, and private
接受的答案引用了oracle的这个文档:
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
由于默认范围仅适用于包,因此不允许您的子类覆盖它甚至访问它。如果要从NewMessage类中删除getText()方法并尝试编译,则可以看到Message类中的getText方法对NewMessage不可见。
我认为与您链接的帖子有相似之处,但不同之处在于,由于未指定访问修饰符,因此仅向包提供访问权限。
答案 1 :(得分:0)
您在Message
课程中的方法具有默认可见性,这意味着它只能在同一个包中显示。因此,对于其他包中的子类,不可见。
由于该方法在包B
中不可见,因此无法覆盖我的NewMessage
。
答案 2 :(得分:-1)
由于不同的原因,这种情况正在发生:
System.out.println(new NewMessage().getText());
您正在创建一个NewMessage
对象,该对象具有该方法。如果您创建了该对象,但它没有该方法,但仍然扩展Message
,则输出将为'text'