网站首页 > 精选教程 正文
定义
里氏替换原则(Liskov Substitution Principle,LSP),官方定义如下: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象 o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型,所有引用基类的地方必须能透明地使用其子类的对象。则通俗的来讲:子类可以扩展父类的功能,但是子类不能修改父类原有的功能 里氏替换原则就是给继承性的使用制定了规范
案例
需求
现在有一个计算器(父类)可以完成加减乘除,定义其子类,来演示继承可能出现的问题
方案一
定义计算器类Calculator.java
/**
* 计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Calculator {
//定义加法功能
public int add(int a,int b){
return a + b;
}
//定义减法功能
public int sub(int a,int b){
return a - b;
}
}
定义超级计算器类SuperCalculator.java
/**
* 超级计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class SuperCalculator extends Calculator{
//增补需求,两数相加再加5
@Override
public int add(int a,int b){
return a + b + 5;
}
//希望两数相加之和与100求差
public int mul(int a,int b){
int count = add(a, b);
return 100 - count;
}
}
定义测试类Test1.java
/**
* 测试类1
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Test1 {
public static void main(String[] args) {
int result = new Calculator().add(4,6);
System.out.println("4和6之和为:" + result);
int mul = new SuperCalculator().mul(4,6);
System.out.println("4和6之和与100相差:" + mul);
}
}
测试结果: 可以看到4和6之后与100相差的结果为85,明显是错误的答案。错误的原因就是SuperCalculator类继承Calculator类之后,重写了add方法,最终在调用的时候产生了错误的答案
方案二
定义基础类Base.java
/**
* 基础类
* @author:liyajie
* @createTime:2022/1/31 15:36
* @version:1.0
*/
public class Base {
}
改造后的超级计算器类SuperCalculatorNew.java
/**
* 超级计算器类
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class SuperCalculatorNew extends Base{
private Calculator calculator = new Calculator();
//增补需求,两数相加再加5
public int add(int a,int b){
return a + b + 5;
}
//希望两数相加之和与100求差
public int mul(int a,int b){
int count = calculator.add(a, b);
return (100 - count);
}
}
测试类Test2.java
/**
* 测试类2
* @author:liyajie
* @createTime:2022/1/31 15:25
* @version:1.0
*/
public class Test2 {
public static void main(String[] args) {
int result = new Calculator().add(4,6);
System.out.println("4和6之和为:" + result);
int mul = new SuperCalculatorNew().mul(4,6);
System.out.println("4和6之和与100相差:" + mul);
}
}
测试结果: 可以看到测试结果正确
对比分析
方案一,直接继承计算器类,并重写了父类的非抽象方法add,导致在调用的时候产生了错误的结果 方案二,继承基础base类,并注入计算器类Calculator类作为依赖,遵守里氏替换原则,得出正确的结果
总结
- 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
- 子类中可以扩展自己的方法
- 里氏替换原则并非让我们尽量避免使用继承
- 里氏替换原则是实现开闭原则的重要方式之一
预告
下篇将分析开闭原则,敬请期待
如需获取源码,请关注后,私信发送"源码"给小编,非常感谢
猜你喜欢
- 2024-11-02 Java,设计模式,七大原则,里氏替换原则(LSP),案例
- 2024-11-02 软件设计七大原则,程序员标配(一)
- 2024-11-02 设计模式七大原则 设计模式七大原则包括
- 2024-11-02 Java设计模式的精神领袖:开闭原则
- 2024-11-02 设计模式第2招第3式之命令模式 命令模式定义
- 2024-11-02 Java代码优化六大原则 java代码优化六大原则有哪些
- 2024-11-02 一天一个设计模式——软件架构设计七大原则
- 2024-11-02 专门画了9张图,搞懂设计模式6大原则,这次应该可以了吧
- 2024-11-02 程序员应知道这十大面向对象设计原则
- 2024-11-02 3张图说清楚:java设计模式原则:开闭、接口隔离、迪米特法则
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)