在研究OCJP时,我遇到了这个包装问题,令我感到惊讶。我在自己的软件包A和B中分别有两个简单的类消息和新消息,如下所示:
package A;
public class Message
{
String getText()
{
return "text";
}
}
和bake b和a:
的子类中的newmessagepackage 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
通过遵循此堆栈超级级别的私人方法可以在子级中被超级训练吗?我尝试使用@Override
标记NewMessage的方法并将其编译给我以下错误:
NewMessage.java:4: error: method does not override or implement a method from a supertype
@Override
^
这意味着我没有覆盖getText()
方法。有人可以向我解释这里发生了什么吗?这种情况类似于我链接的帖子中私人Mehthod覆盖的情况吗?
类Message
中的方法具有 default 可见性,这意味着仅在同一软件包中可见。因此,对于其他软件包中的子类是不可见的。
由于该方法在软件包B
中不可见,因此无法覆盖我的NewMessage
。
我认为这个问题的答案有您要寻找的内容:
在Java中,默认,公共,受保护和私人
之间的差异接受的答案参考本文档来自Oracle:
http://docs.oracle.com/javase/tutorial/java/javaoo/accesscontrol.html
由于默认范围仅适用于软件包,因此不允许您的子类覆盖甚至访问它。如果要从newmessage类中删除getText()方法并尝试编译,则可以看到消息类中的getText方法不可见。
我认为与您链接的帖子有相似之处,但区别在于,由于未指定未访问修改器,因此仅对软件包提供了访问。
这是由于不同的原因而发生的:
System.out.println(new NewMessage().getText());
您正在创建具有该方法的NewMessage
对象。如果您创建了该对象,并且它没有方法,但仍扩展了Message
,则输出将为'text'