里式替换原则(LSP)
里式替换原则是设计模式七大原则之一,这个原则是我们学习设计模式的基础,里式替换原则就是引导我们正确的去使用继承,由于当时在学习这个原则的时候,花费了不少时间,学习这个原则也顺带复习了java基础中的继承、重载和重写。所以才写下这篇文章,作为整理。如有写的不对的地方,麻烦各位大佬指正!
重载(overload)
重载的规则:
①方法名必须相同
②参数列表必须不同(包括参数的个数不同、参数的类型不同、参数个数相同但是不同类型参数的位置不同三种情况)
③与方法的返回值、方法的修饰符、抛出的异常无关,可同可不同
④重载是编译时多态
代码输出的结果是:参数是父类型
重写(override)
重写的规则:
①方法名、参数列表必须相同(两同)
②方法的返回值、抛出的异常小于等于父类的(两小)
③方法的修饰符大于等于父类的(一大)
④重写是运行时多态
代码输出的结果是:子类重写了父类的方法
特别注意:
下面这种情况是子类重载了父类的方法,并不是重写,因为参数列表修改了
继承
继承是Java中最基础也是重要的特性之一,Java中使用extends关键字来实现继承,并且Java只支持单继承。但是,接口允许多继承。
继承的优点:
①提高代码的重用性
②提高代码可扩展性
继承的缺点:
①继承具有侵入性
②继承会增强类的耦合性
③继承会使程序的可移植性降低
总的来说,继承有利有弊,为了正确的使用继承,引入了里式替换原则
里式替换原则
继承虽然可以提高代码的可重用性,子类继承父类,可以直接使用父类的方法而不用再去声明创建,但继承也带来一定的弊端,继承实际上让两个类耦合性增强了,修改父类可能使子类出现故障;我们在实际开发过程中,子类在继承父类后,根据多态的特性,可能是图一时方便,经常任意重写父类的方法,那么这种方式会大大增加代码出问题的几率。
遵循里式替换原则,应该:
1.子类可以实现父类的抽象方法,但是对于父类的非抽象方法,应该如实的去继承,尽量不要重写。
2.任何使用父类对象的方法都能透明的使用子类对象。(核心)
但是需要注意的是:里氏替换原则可以正着用,但不能反过来使用,即子类出现的地方,父类未必可以胜任。
3.如果只是想使用父类的方法,尽量不要使用继承,可以使用依赖、聚合、组合等方式
4.当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。(参考链接)
5.覆盖或实现父类方法时输出结果可以被缩小
6.子类中可以增加自己特有的方法。但是应当尽量避免子类增加自己特有的方法,一旦子类增加自己特有的方法,这个子类和父类之间的关系将难以调和。