该问题依赖于里氏代换原则, 先记录下该原则的原理。
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
把里氏代换原则解释得更完整一些:在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。
因为向上转型及java程序设计维护的原因
例:
假设一个父类 A 拥有的方法 public void setXxx() {} 可以被其他任意对象调用,这个方法被子类 B 重写后为 void setXxx() {} 即 默认的 访问权限只能被自己和本包所访问。
假设其他包中的对象调用方法为:
get(A a) {
a.setXxx();
}
而此时传入的对象为 B 类对象,假设为 b,此时 b 将转型为 a 但是 b 中的 setXxx() 访问权限已经被缩小了,这将造成错误。
以上只是一个例子还有其他出于易维护、易代码结构设计的设计思想原因。