里氏替换原则:LSP
定义:
如果对于每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都换为o2时,程序的行为没有发生变化,那么S是T的子类型。
在继承的时候,父类出现的地方子类就可以出现,子类可替代父类,因为子类中有父类的方法,然而父类却不可以替代子类,因为子类中可能有父类没有的方法。这就是所谓的向下转型是不安全的。
使用继承有很多优点,可以提高代码的重用性,提高可扩展性、开放性,但是不可否认,继承也是有缺点的:
1.继承是侵入性的,只要继承,就必须拥有父类的所有属性和方法;
2.降低代码的灵活性
3.增强了耦合性。
解决方案就是里氏替换原则。
4个含义:
1.子类必须完全实现父类的方法
2.子类可以有自己的方法
3.覆盖或实现父类的方法时,输入参数可以被放大
4.覆写或实现父类的方法时,输出结果可以被缩小
前两个含义比较好理解,这里就不再赘述,主要说一下3和4。
先说第3个,覆盖或实现父类的方法时,输入参数可以被放大。
先看一个例子:
class Father {
public Collection dosomething(HashMap map) {
System.out.println("父类被执行--->");
return map.values();
}
}
class Son extends F