我有以下两节课:

A级

package A;
public class A {
    protected String classType(){
        return "s1";
    }
}


C级

package B;

import A.A;

public class C extends A{
    public static void main(String[] args){
    C c=new C();
    c.classType();//no error
    A a=new C();
    a.classType();//error
    }
}


为什么即使我们正在访问受保护的方法(即使据说在不同包的子类中也具有访问权限),第二个错误仍会发生?

最佳答案

在扩展父类的类的上下文中,跨包允许对protected方法的访问。

在您的情况下,您正在类的实例上调用该方法,因此它不可见。

如果您在C中有调用classType()的实例方法或语句,那实际上会调用super#classtype(),除非您在C中覆盖了它。

例如。

public class C extends A {
    {
        // ok, instance statement
        String foo = classType();
    }
   void foo() {
        // ok, instance method
        String foo = classType();
   }
}

关于java - 不同包中子类访问中的 protected 方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34770673/

10-12 01:24