包装/默认访问权限的交叉包继承



在研究OCJP时,我遇到了这个包装问题,令我感到惊讶。我在自己的软件包A和B中分别有两个简单的类消息和新消息,如下所示:

package A;
public class Message
{
    String getText()
    {
        return "text";
    }
}

和bake b和a:

的子类中的newmessage
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

通过遵循此堆栈超级级别的私人方法可以在子级中被超级训练吗?我尝试使用@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'

最新更新