为什么Java中子类重写父类方法权限修饰符不能降低

该问题依赖于里氏代换原则, 先记录下该原则的原理。

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

把里氏代换原则解释得更完整一些:在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。

因为向上转型及java程序设计维护的原因

例:
假设一个父类 A 拥有的方法 public void setXxx() {} 可以被其他任意对象调用,这个方法被子类 B 重写后为 void setXxx() {} 即 默认的 访问权限只能被自己和本包所访问。

假设其他包中的对象调用方法为:

get(A a) {
	a.setXxx();
}

而此时传入的对象为 B 类对象,假设为 b,此时 b 将转型为 a 但是 b 中的 setXxx() 访问权限已经被缩小了,这将造成错误。

以上只是一个例子还有其他出于易维护、易代码结构设计的设计思想原因。

你可能感兴趣的:(Java,java)