【问题标题】:Why is it not allowed to narrow down scope of a method while overriding为什么在覆盖时不允许缩小方法的范围
【发布时间】:2012-07-14 03:23:30
【问题描述】:

在 Java 中,当我重写一个方法时,编译器会将任何试图缩小可见性范围的尝试标记为错误。例如:我不能将公共方法覆盖为受保护的,而我可以将受保护的方法覆盖为公共的。

我有兴趣了解此规则背后的设计决策/思考。

【问题讨论】:

标签: java oop inheritance


【解决方案1】:

子类应始终满足超类的约定。见Liskov Substitution principle

方法的可见性是本合同的一部分。因此,在超类中公开可见的任何内容在子类中也应该是公开的。

【讨论】:

  • 我有一个查询,
【解决方案2】:

考虑一个继承自A 的类BA.m() 是公开的。现在考虑这段代码:

A obj = new B();
obj.m();

应该允许这个调用吗?是的,应该,因为objA 类型的对象!它也是B 类型的对象,但使用该对象的人不一定知道。

A 类型的每个对象都必须遵守A 的协定(接口)。 B 扩展 A,因此也必须遵守该合同。

【讨论】:

    【解决方案3】:

    在摆脱或实施访问级别时,我们应该使用相同的访问级别或更宽的访问级别。

    private < (default) < protected < public
    

    公共范围最广。

    在接口中,所有成员都是默认公共的。因此,在实施或覆盖时,我们必须只公开。

    【讨论】:

      【解决方案4】:

      假设父类和子类具有覆盖公共访问修饰符的方法。

      class Parent{
      
      public void m(){
      // method implementation
      }
      
      }
      class Child extends Parent{
      @Override
      public void m(){
      //child implementation
      }
      }
      

      假设有一些类正在使用这样的功能

      Parent p = new Child();
      p.m(); // this access is fine, because JVM calls Overriding method at run time
      

      现在,如果我们将覆盖方法的访问权限更改为公共以下的任何内容

      class Child extends Parent{
      @Override
      void m(){
      //Child implementation
      }
      }
      

      现在一些能够使用方法 m() 功能的类可能无法访问该函数。这不是我们想要的行为。

      因此规则是重写方法不应缩小被重写方法的范围

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 2017-12-16
        • 2022-01-19
        • 2011-02-27
        • 1970-01-01
        • 2014-11-14
        相关资源
        最近更新 更多