所有引用基类的地方必须能够透明的使用其子类的对象,通俗的说,只要父类可以出现的地方子类就可以出现
- 在类中调用其他类的时候,务必使用父类和接口,如果不能使用父类或接口,这说明类的设计已经违反LSP原则
需要注意的是:所有子类中方法的前提条件必须与超类中被覆写的方法的前提条件相同或更宽松
如果子类覆写父类方法,子类的返回值类型S一定是父类返回值类型 T相同,或是T是S父类,这样才符合里氏替换原则
如果子类重载父类方法,则子类的参数范围要大于父类的参数范围,这样子类的重载方法不会被调用,符合里氏替换原则!
package chapter_02;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class LishiTest {
public static void main(String[] args) {
HashMap map = new HashMap();
//父类调用
father f = new father();
f.doSomething(map);
//子类代替父类,请注意和多态的区别,不是父类应用指向子类对象
son f1 = new son();
f1.doSomething(map);
}
}
class father {
public Collection doSomething(Map map) {
System.out.println("父类被执行");
return map.values();
}
}
class son extends father {
public Collection doSomething(HashMap map) {
System.out.println("子类被执行");
return map.values();
}
}
执行结果:
父类被执行
子类被执行
而采用里氏替换原则的目的是增强程序健壮性,即使增加子类不会影响原来的子类!