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

Posted

技术标签:

【中文标题】更改Java中重写方法的访问修饰符?【英文标题】:Change the access modifier of an overridden method in Java? 【发布时间】:2012-03-08 22:56:53 【问题描述】:

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

abstract class Foo
    void start()...

然后将包私有访问修饰符更改为public

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

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

【问题讨论】:

java access modifiers and overriding methods 的可能重复项 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

是的,这是我能看到的唯一好处......我不知道是否还有其他好处。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

解释是这样的:-

这是 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 类型的子对象

【讨论】:

【参考方案5】:

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

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

【讨论】:

接口中定义的所有方法都是隐式公开的。 接口的所有方法都必须是公共的。 你不能在公共或受保护的接口中声明非公共方法(只有上帝知道受保护的接口是什么意思)。 java.sun.com/docs/books/jls/second_edition/html/… 见第 9.1.4 节 没错,在实现接口和扩展类时仍然是可能的。我将编辑我的答案。

以上是关于更改Java中重写方法的访问修饰符?的主要内容,如果未能解决你的问题,请参考以下文章

将 java 项目导出到 jar 更改了访问修饰符

为啥子类重写父类的方法的访问修饰符,不能低于父类的方法访问权限?

面试06,java的访问权限修饰符

java访问修饰符

Java访问修饰符

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?