请考虑以下代码段:
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()).