java - 在父类中的方法受保护的情况下,“对对象的引用”如何在动态方法调度中发挥作用?
问题描述
我对 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 类中访问)
有人可以帮我理解这里所涉及的逻辑吗?
解决方案
通过使a1
A
您的类型只能访问A
该类的成员,除非它们在子类中被覆盖,如下所示:
class C extends A{
@Override
public void m1(){
System.out.println("C's implementation");
}
这将导致类中的m1
方法在作为.C
C
A
您可以使访问修饰符的限制性等于或小于基础。如您的示例所示,它从protected
变为public
。
推荐阅读
- listview - 我可以向我的列表视图构建器添加更多条件吗?
- mongodb - 缓存清除时的mongodb LockException错误
- bash - 使用 awk、粘贴和管道组合 sprio 和 squeue 的输出
- c# - 为什么单个插入语句源自两行而不是单行?
- machine-learning - 为什么我的神经网络序列模型从一开始就达到 0.9998 精度?
- android - Oreo+ 中的 SMS 广播接收器
- html - 我只需要在我的 div 中更改锚标记的样式,并为其他 div 使用不同的样式
- sql - 如何在 SQL 中发出查询请求以在主选择之前预选行
- python - 我的 Python 代码在尝试登录时不起作用?
- docker - github 操作 - 无法连接到 mysql