Har*_*ran 7 java oop inheritance encapsulation access-specifier
请考虑以下代码段:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
SedanCar是AbstractVehicle包含protected方法的子类speedFactor.speedFactor如果它被同一个类引用,我可以调用该方法.当超类用于参考时,该方法speedFactor不可访问.
隐藏方法的原因是什么?
您的SedanCar课程与课程位于不同的包中AbstractVehicle。protected方法只能从同一个包或子类访问。
在以下情况下SedanCar:
SedanCar sedan = new SedanCar();
sedan.speedFactor();
Run Code Online (Sandbox Code Playgroud)
您正在protected从同一个包中调用一个方法:好的。SedanCar在包中car,main()方法在包中的类中car(实际上是同一个类)。
在以下情况下AbstractVehicle:
AbstractVehicle vehicle = new SedanCar();
vehicle.speedFactor();
Run Code Online (Sandbox Code Playgroud)
您尝试protected从另一个包调用一个方法:不行。该main()从中你尝试调用它的方法是在包装car,而AbstractVehicle在包vehicle。
基本明白这个:
您有一个AbstractVehicle在另一个包 ( vehicle) 中声明的类型变量。它可能包含也可能不包含动态类型的SedanCar. 在您的情况下确实如此,但它也可以保存在另一个包中定义的任何其他子类的实例,例如在sportcar. 并且由于您在包car(main()方法)中,因此不允许调用vehicle.speedFactor()(这是 protected AbstractVehicle.speedFactor())。