具有包/默认访问权限的跨包继承

时间:2016-12-20 16:22:21

标签: java oop inheritance packages

在学习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()方法。 有人可以向我解释这里发生了什么吗?这种情况类似于我链接的帖子中的私有方法覆盖的情况吗?

3 个答案:

答案 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'