首页 > 解决方案 > 在父类中的方法受保护的情况下,“对对象的引用”如何在动态方法调度中发挥作用?

问题描述

我对 java 运行时多态性与受保护的访问修饰符的行为感到困惑。我在包中有一个名为 A 的类Pack1,如下所示:

package Pack1;
public class A{
    protected void m1(){
        System.out.println("A's implementation");
    }
}

以及包中名为 C 的子类Pack2,如下所示:

package Pack2;
import Pack1.*;

class C extends A{
    public void m1(){
        System.out.println("C's implementation");
    }
    public static void main(String[] args){
        A a1 = new C();
        a1.m1();
    }
}

现在,如果m1()在父类中是公共的,它不会m1()在子类中使用父类的引用调用任何错误,但在这种m1()受保护的特殊情况下,它会给出错误消息:

m1() 在 A 中具有受保护的访问权限。(毕竟是受保护的,m1() 应该可以在 C 类中访问)

有人可以帮我理解这里所涉及的逻辑吗?

标签: java

解决方案


通过使a1 A您的类型只能访问A该类的成员,除非它们在子类中被覆盖,如下所示:

class C extends A{
    @Override
    public void m1(){
        System.out.println("C's implementation");
    }

这将导致类中的m1方法在作为.CCA

您可以使访问修饰符的限制性等于或小于基础。如您的示例所示,它从protected变为public


推荐阅读