在Java中更改被覆盖方法的访问修饰符?

2022-09-01 17:07:56

是否有原因可以更改重写方法的访问修饰符?例如

abstract class Foo{
    void start(){...}
}

然后将包专用访问修饰符更改为 ,public

final class Bar extends Foo{
    @Override
    public void start(){...}
}

我只是出于好奇而问这个问题。


答案 1

Java 不允许使访问修饰符更具限制性,因为这将违反子类实例应可用于代替超类实例的规则。但是,当涉及到使访问限制更少时...好吧,也许超类是由另一个人编写的,他们没有预料到你想使用他们的类的方式。

人们编写的程序以及编程时出现的情况是如此多样化,以至于语言设计人员最好不要“猜测”程序员可能想用他们的语言做什么。如果没有充分的理由说明程序员不能在子类中减少访问说明符的限制(例如),那么最好将该决定留给程序员。他们知道自己个人情况的具体情况,但语言设计师却不知道。所以我认为这是Java设计者的一个很好的呼吁。


答案 2

只有一个,您可能希望覆盖被更多的类看到,因为没有修饰符是默认的,公共扩大了它。


推荐