里氏替换原则: 任何能用父类对象的地方,都能透明的使用子类替换
ps:子类替换父类时,不能比父类的访问修饰更严格,不能抛出父类不存在的异常
使用时,需要考虑:
1.是否有is-a的关系
2.有is-a关系后,要考虑子类替换父类后会不会出现逻辑变化
反例:
class Counter { public int add(int i,int j) { return i+j; } } class soonCounter extends Counter{ @Override public int add(int i, int j) { return i-j; } } public static void main(String[] args) { Counter c = new Counter(); System.out.println(c.add(100,200)); //结果300 Counter c = new soonCounter(); System.out.println(c.add(100,200)); //结果-100 }
我们要知道,在发生向上转型的过程时,方法的调用只和new的对象有关系,所以造成了不同的结果
使用里氏替换原则时,要知道 子类可以扩展父类的功能,但不能改变父类原有的功能