为什么我们不能改变子类中静态方法的访问修饰符

问题描述 投票:0回答:1

因为我们无法在子类中重写超类的静态方法。虽然我们可以在子类中使用具有相同签名的相同方法,但这就是方法隐藏。 那么为什么我们无法更改子类中静态方法的访问修饰符呢?为什么它遵循改变访问修饰符的方法覆盖规则。

class Vehicle {
   public static void staticMethod() {}
}


class Car extends Vehicle {
  public static void staticMethod() {} 
}

我尝试更改子类中staticMethod的访问修饰符,但它给出了错误,这意味着: 我们只能在子类的 staticMethod 中拥有 public 访问修饰符。 我们无法将其更改为 privatedefaultprotected

我对 staticMethod 的这种行为感到困惑。

java inheritance static overriding
1个回答
0
投票

因为代码需要能够确定“给定

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
那么答案就是“是”。

总体思路是,给定超类型的代码不应考虑访问规则上的子类型或存在歧义。

© www.soinside.com 2019 - 2024. All rights reserved.