Java 超级类中受保护的方法在另一个包的子类中可见吗?

Java 超级类中受保护的方法在另一个包的子类中可见吗?,java,inheritance,superclass,protected,access-modifiers,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 f

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

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文档中读到,受保护的成员在另一个包的子类中可见。所以fun()应该在包2中的子类中可见。那为什么会有错误呢


我是否严重遗漏了一些非常明显的东西?

受保护的方法只对内部的子类可见。如果您创建了一个新的
超类实例
,那么您就是从外部访问它。

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

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


在您的示例中,因为
s
是与
不同的对象,所以不能调用
s.fun()。但是对象本身可以调用
fun
方法-使用
this.fun()
或只调用
fun()

该方法对
子类
本身的实例可见。因此,您可以调用
this.fun()
。但是如果您创建一个不同的实例并尝试调用它的方法,它将不允许,因为
子类
的实例与
超类
的实例没有任何关系。“可见”不能提供完整的信息。您可以在自身上调用该方法,即
this.fun()
或简单地
fun()
,但是当您创建
超类的新实例时,该方法是禁止使用的,因为
子类
成为
超类
的“常规”客户端,尽管也从它继承。