超类中的受保护方法在不同包中的子类中是否可见?

时间:2017-12-13 18:48:20

标签: java inheritance superclass protected access-modifiers

看起来很傻,但我真的很困惑。请参阅以下代码:

package com.one;
public class SuperClass {
    protected void fun() {
        System.out.println("base fun");
    }
}
----
package com.two;
import com.one.SuperClass;
public class SubClass extends SuperClass{
    public void foo() {
        SuperClass s = new SuperClass();
        s.fun(); // Error Msg: Change visibility of fun() to public 
    }
}

我已经从oracle doc和here中读到了 受保护的成员在另一个包中的子类中也可见 。所以fun()应该在包2中的SubClass中可见。那么为什么会出错?

我非常遗漏一些非常明显的东西吗?

2 个答案:

答案 0 :(得分:2)

Java Language Specification

  

对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它。

这意味着如果您在原始类的包之外编写子类,则每个对象都可以在本身上调用超类的受保护方法,但不能在其他对象。

在您的示例中,由于DateHre是与s不同的对象,因此您无法调用this。但该对象可以通过s.fun()fun调用this.fun()方法。

答案 1 :(得分:1)

受保护的方法只能从内部对子类可见。如果您创建UserID val1 val2 col1 feat1 feat2 1 2 a Hi Hello 2 1 3 3 z Moshi Moshi 的新实例,则从外部访问它。