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

时间:2012-02-17 14:28:47

标签: java access-modifiers method-overriding

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

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

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

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

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

5 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:2)

  

解释如下: -

     

这是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

类型的子对象

答案 4 :(得分:1)

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

如果无法做到,那么在某些情况下,某个类无法实现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();
}