里氏替换和多态
里氏替换
- 所有引用基类的地方必须能透明地使用其子类的对象(不影响程序原有的逻辑)
public class Father {
public void say(HashMap map){
System.out.println("父类方法被执行...");
}
}
public class Son extends Father {
public void say(Map map) {
System.out.println("子类方法调用...");
}
public static void main(String[] args) {
invokeFather();
invokeSon();
}
private static void invokeFather() {
Father father = new Father();
HashMap map = new HashMap();
father.say(map);
}
private static void invokeSon() {
Father father = new Son();
HashMap map = new HashMap();
father.say(map);
}
}
多态
- 父类引用指向具体子类
咋一看,这两个有点矛盾, 两种方式都是通过继承方式,继承不好的地方就是打破的类原有的封装
一般的,如果是想继承了一个父类,那么意图就是要扩展父类的功能,实现代码的复用
但是对比里氏替换和多态两种原则,仔细一看,还是有冲突,如果运用的不当,容易影响程序逻辑
什么时候用
什么时候容易用错里氏替换?当父类和子类都是非抽象类的时候,子类使用了覆盖并没有使用重载,当主程序用子类替换成父类后,逻辑走向了子类而并没有走原来的父类
我的理解就是里氏替换的使用,仅仅是扩展父类功能,而并不想改变父类的原始的功能,相反只是增加一些新的方法 ;而多态的使用,不仅仅是想扩展父类的功能,而且更多的是通过重写父类方法,覆盖或者增加子类特有的功能,达到通过调用父类的方法从而最终指向具体的子类的实现方法