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

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

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

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

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

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

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

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

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

扩展类意味着子类至少应该为其他类提供相同的function。

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

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

解释是这样的: –

这是OOP中的一个基本原则:子类是>父类的完全成熟的实例,因此必须至少提供与父类相同的接口。 >使受保护/公共事物不那么明显会违反这一想法; 您可以使子>类不可用作父类的实例。

  class Person{ public void display(){ //some operation } } class Employee extends Person{ private void display(){ //some operation } Person p=new Employee(); 

这里p是类型为Person(超类)的对象引用,当我们调用> p.display()时,由于访问修饰符更具限制性,对象引用p无法访问Employee类型的子对象

编辑:好的,我改变了我的答案来解决问题。

如果无法做到这一点,那么在某些情况下,类将无法实现iterface并扩展类,因为它们具有使用不同访问修饰符的相同方法。

 public Interface A { public void method(); } public abstract classs B { protected void method(); } public class AB extends B implements A { /* * This would't be possible if the access modifier coulnd't be changed * to less restrictive */ public void method(); }