一、原则:
继承必须确保超类所拥有的性质在子类中仍然成立。子类可以扩展父类的功能,但不能改变父类原有的功能。子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。
二、作用:
1.里式替换原则是实现开闭原则的重要方式之一。
2.它克服了继承中重写父类造成的可复用性变差的缺点。
3.它是动作正确性的保证。即类的扩展不会给已有的系统引入新的错误,降低了代码出错的可能性。
4.加强程序的健壮性,同时变更时可以做到非常好的兼容性,提高程序的维护性,可扩展性,降低需求变更时引入的风险。
三、实现方式:
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类中可以增加自己持有的方法
3.当子类的方法重载父类的方法时,方法的前置条件(即输入参数)要比父类的方法更宽松
4.当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的输出/返回值)要比父类的方法更严格或相等。
四、涉及到哪些设计模式?
抽象工厂模式、工厂方法模式、简单工厂模式
五、示例:
父类:
public class Parent {
public int calculate(int a, int b) {
return a+b;
}
}
子类:
public class Child extends Parent {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
实现:
public class MainTest {
public static void main(String[] args) {
Parent c = new Child();
System.out.println("result1:" + c.calculate(1, 2));
Parent parent = new Parent();
System.out.println("result2:" + parent.calculate(1, 2));
}
}
效果:
可以看到,虽然都是calculate方法,但是结果却不相同,原因是因为子类Child中将calculate方法覆写,导致结果有变化。在实际运用中,这个会使得调用逻辑混乱,相同方法一个相加另一个确实相减。如果子类是需要一个减法,应该是增加一个减法方法:
public class Child extends Parent {
@Override
public int calculate(int a, int b) {
return super.calculate(a, b);
}
/**
* 新增减法方法
*
* @param a
* @param b
* @return
*/
public int subtraction(int a, int b) {
return a - b;
}
}