java – 为什么无法从子类访问受保护的方法?
请考虑以下代码段:
package vehicle; public abstract class AbstractVehicle { protected int speedFactor() { return 5; } } package car; import vehicle.AbstractVehicle; public class SedanCar extends AbstractVehicle { public static void main(String[] args) { SedanCar sedan = new SedanCar(); sedan .speedFactor(); AbstractVehicle vehicle = new SedanCar(); // vehicle //WON'T compile // .speedFactor(); } } SedanCar是AbstractVehicle的子类,它包含受保护的方法speedFactor.如果它被同一个类引用,我可以调用方法speedFactor.当超类用于引用时,无法访问方法speedFactor. 隐藏方法的原因是什么? 解决方法
您的SedanCar类与AbstractVehicle类位于不同的包中.受保护的方法只能从同一个包或子类访问.
如果是SedanCar: SedanCar sedan = new SedanCar(); sedan.speedFactor(); 您正在从同一个包中调用受保护的方法:好的. SedanCar在包中,而main()方法是在包车中的类(实际上是同一类). 在AbstractVehicle的情况下: AbstractVehicle vehicle = new SedanCar(); vehicle.speedFactor(); 您尝试从另一个包调用受保护的方法:不行.您尝试调用它的main()方法是在包汽车中,而AbstractVehicle在包车中. 基本上理解这个: 你有一个AbstractVehicle类型的变量,它在另一个包(车辆)中声明.它可能包含也可能不包含动态类型的SedanCar.在你的情况下它确实如此,但它也可以包含另一个包中定义的任何其他子类的实例,例如在sportcar.因为你在package car(main()方法),所以不允许你调用vehicle.speedFactor()(受保护的AbstractVehicle.speedFactor()). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java基础-多线程二
- Typescript使用字符串联合类型代替枚举类型
- java.lang.IllegalArgumentException“无法使用Spring 4和H
- java – 在Spring中将PersistenceException转换为DataAcces
- java – Apache Spark,创建hive上下文 – NoSuchMethodExce
- 定义hashcode时使用31系数的原因
- 浅谈spring-boot 允许接口跨域并实现拦截(CORS)
- Java LinkedList:从中移除到
- 硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的
- java生成html万年历