里式替换原则 主要有以下三点内容:
- 从方法的角度:子类不应该改变父类原有方法的逻辑。
- 从方法参数的角度:子类方法参数应该比父类方法参数范围大。
- 从方法返回值的角度:子类方法返回值应该比父类方法返回值范围小。
从方法的角度,这句话很好理解,我们不做过多解释,我们直接来看从方法参数的角度
父类:参数范围大
package Ls;
import java.util.Map;
/**
* ClassName: LsParent <br/>
* Description: <br/>
* date: 2021/6/28 20:46<br/>
*
* @author yiqi<br />
* @since JDK 1.8
*/
public class LsParent {
public void LsTest(Map map){
System.out.println("父类打印了");
}
}
子类:参数范围小
package Ls;
import java.util.HashMap;
/**
* ClassName: LsChild <br/>
* Description: <br/>
* date: 2021/6/28 20:49<br/>
*
* @author yiqi<br />
* @since JDK 1.8
*/
public class LsChild extends LsParent{
public void LsTest(HashMap hashMap) {
System.out.println("子类打印了");
}
}
主函数
package Ls;
import java.util.HashMap;
/**
* ClassName: Main <br/>
* Description: <br/>
* date: 2021/6/28 20:51<br/>
*
* @author yiqi<br />
* @since JDK 1.8
*/
public class Main {
public static void main(String[] args) {
LsChild lsOne = new LsChild(); //打印结果会随着 LsChild/LsParent 的不同而不同
HashMap<String,String> hashMap = new HashMap<>();
lsOne.LsTest(hashMap);
}
}
在主函数中 lsOne 的类型为 LsChild 时, 打印 “子类打印了”;为 LsParent 是 ,打印 “父类打印了”,这种情况肯定是我们不希望的,所以,你得满足 子类方法参数应该比父类方法参数范围大 的条件。再打印就只会打印 “父类打印了”。
从方法返回值的角度,编译器比较智能,不满足 子小父大 的条件会报错