在Java中更改重写方法的访问修饰符?

mre*_*mre 19 java overriding access-modifiers

有没有理由可以更改被覆盖方法的访问修饰符?例如,

abstract class Foo{
    void start(){...}
}
Run Code Online (Sandbox Code Playgroud)

然后将package-private访问修饰符更改为public,

final class Bar extends Foo{
    @Override
    public void start(){...}
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*x D 20

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

人们编写的程序和编程时出现的情况如此多样化,语言设计者最好不要"猜测"程序员可能想用他们的语言做什么.如果没有很好的理由,为什么程序员应该能够使访问说明在子类中(例如)限制较少,那么最好离开这个决定的程序员.他们知道他们个人情况的具体情况,但语言设计师却不知道.所以我认为这是Java设计师的一个很好的调用.


Osc*_*mez 6

只有一个,您可能希望覆盖更多类可见,因为默认情况下没有修饰符,public扩展了它.


adr*_*ale 6

扩展类意味着子类至少应该为其他类提供相同的功能.

如果他扩展了那个,那么这不是问题.

扩展可以是添加新方法,也可以通过向更多类提供现有方法,例如将包访问方法公开.