含义:只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或异常
LSP有如下要求:
*子类型可以增加方法,但不可删
* 子类必须完全实现父类的方法
*子类型中重写的方法必须有相同或子类型的返回值
*子类型中重写的方法必须使用同样类型的参数
*子类型中重写的方法不能抛出额外的异常
Same or stronger invariants 更强的不变量
Same or weaker preconditions 更弱的前置条件
Same or stronger postconditions 更强的后置条件
同时,可以从这里面引申出协变和反协变。
若子类型方法的返回值是父类型的子类,那么它就是协变的。例如:
子类S的方法a返回的是String类型的,而父类是Object类型的。显然,String类型是Object类的子类。所以这是一个协变。
再来看一个异常类的协变:
这就告诉我们,实现协变是要让子类的方法返回值要比父类的类型要低,同时,子类型的异常也是一样的。子类型的异常要更具体才能实现协变。