为什么在覆盖方法时不能降低可见性(默认为默认公开)

时间:2018-07-19 08:09:20

标签: java core return-type method-overriding


这是一个非常基本的概念,我们无法在覆盖时降低方法的可见性。但是我想知道为什么吗?

class Parent{
  public void getData(){
   System.out.println("Parent GetData")
  }
}
class Child{
  void getData(){
   System.out.println("Parent GetData")
  }
}
public class OverridingDemo{
 public static void main(String[] args)
 {
  Parent p = new Child();
  p.getData(); // Error
 }
}

在这里,我们将返回类型更改为默认类型,以允许访问同一软件包。那么为什么不允许将返回类型更改为默认类型?
我确实知道,如果它是私有的或受保护的,那么在那种情况下就无法访问它,但是为什么不默认呢?
是的,已经有很多线程可用,但是我无法清楚地理解这个概念。

3 个答案:

答案 0 :(得分:2)

这是有关SOLID规则之一的Liskov substitution principle。这就是现代应用程序如何使用多态和OOP范例的所有方式。

从运行时和编译时开始,是否存在程序包专用访问修饰符。

之所以无法完成,恰恰是因为如果您有一个带有公共方法com.yadvendra.vehicles.Car的类int speed(),那么其他对象应该总是可以对其进行扩展(添加新的逻辑,例如Decorator Pattern)等)。假设您要将Car对象返回到其他包中的其他一些类,例如com.yadvendra.view.CarView。此类希望使用您的公共方法int speed(),但不能这样做,因为您将其可见性级别降低为package-private。

答案 1 :(得分:1)

  

我确实知道,如果它是私有的或受保护的,那么在那种情况下就无法访问它,但是为什么不默认呢?

默认访问权限没有不同。这是一个相对的比较:不允许将范围缩小到任何限制性更强的范围,仅仅是因为它破坏了超类的契约,如注释中所述。

附带说明:您似乎理解protected的范围比default / package-private范围小。这不是真的。 protectedpackage-private及更多。

答案 2 :(得分:0)

API的用户仅应知道Parent类。您如何向他们解释,他们现在可以使用某种方法,仅仅是因为如果父类的实现降低了子类的可见性,那么该方法就可以了?