因为我们无法在子类中重写超类的静态方法。虽然我们可以在子类中使用具有相同签名的相同方法,但这就是方法隐藏。 那么为什么我们无法更改子类中静态方法的访问修饰符呢?为什么它遵循改变访问修饰符的方法覆盖规则。
class Vehicle {
public static void staticMethod() {}
}
class Car extends Vehicle {
public static void staticMethod() {}
}
我尝试更改子类中staticMethod的访问修饰符,但它给出了错误,这意味着: 我们只能在子类的 staticMethod 中拥有 public 访问修饰符。 我们无法将其更改为 private、default 和 protected。
我对 staticMethod 的这种行为感到困惑。
因为代码需要能够确定“给定
Vehicle
(实际上可能是 Car
或其他子类),我可以调用该方法吗?”。制作 Car
private
意味着根据子类有特殊规则。取一个 Vehicle
数组,其中一些是 Car
,那么它们就没有统一的规则。
你可以改变访问修饰符,你只是不能让它变弱,所以
class Vehicle {
private static void staticMethod() {}
}
class Car extends Vehicle {
public static void staticMethod() {}
}
没问题,因为“给定
Vehicle
(实际上可能是 Car
或其他子类),我可以调用该方法吗?”如果您混合使用 Vehicle
和 Car
,则只会显示“否”。如果您明确只有 Car
那么答案就是“是”。
总体思路是,给定超类型的代码不应考虑访问规则上的子类型或存在歧义。