为什么无法从子类访问受保护的方法?

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)

SedanCarAbstractVehicle包含protected方法的子类speedFactor.speedFactor如果它被同一个类引用,我可以调用该方法.当超类用于参考时,该方法speedFactor不可访问.

隐藏方法的原因是什么?

icz*_*cza 6

您的SedanCar课程与课程位于不同的包中AbstractVehicleprotected方法只能从同一个包或子类访问。

在以下情况下SedanCar

SedanCar sedan = new SedanCar();
sedan.speedFactor();
Run Code Online (Sandbox Code Playgroud)

您正在protected从同一个包中调用一个方法:好的。SedanCar在包中carmain()方法在包中的类中car(实际上是同一个类)。

在以下情况下AbstractVehicle

AbstractVehicle vehicle = new SedanCar();
vehicle.speedFactor();
Run Code Online (Sandbox Code Playgroud)

您尝试protected从另一个包调用一个方法:不行。该main()从中你尝试调用它的方法是在包装car,而AbstractVehicle在包vehicle

基本明白这个:

您有一个AbstractVehicle在另一个包 ( vehicle) 中声明的类型变量。它可能包含也可能不包含动态类型的SedanCar. 在您的情况下确实如此,但它也可以保存在另一个包中定义的任何其他子类的实例,例如在sportcar. 并且由于您在包carmain()方法)中,因此不允许调用vehicle.speedFactor()(这是 protected AbstractVehicle.speedFactor())。