里式替换原则 主要有以下三点内容:

  • 从方法的角度:子类不应该改变父类原有方法的逻辑。
  • 从方法参数的角度:子类方法参数应该比父类方法参数范围大。
  • 从方法返回值的角度:子类方法返回值应该比父类方法返回值范围小。
代码示例

从方法的角度,这句话很好理解,我们不做过多解释,我们直接来看从方法参数的角度

父类:参数范围大

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 是 ,打印 “父类打印了”,这种情况肯定是我们不希望的,所以,你得满足 子类方法参数应该比父类方法参数范围大 的条件。再打印就只会打印 “父类打印了”。

里式替换原则_父类

从方法返回值的角度,编译器比较智能,不满足 子小父大 的条件会报错

里式替换原则_父类_02