首页 > Java > java教程 > 正文

什么是里氏替换原则_Java OOP设计行为规范说明

P粉602998670
发布: 2025-12-20 10:31:21
原创
755人浏览过
里氏替换原则要求子类对象能安全替换父类对象且行为不变;核心是子类不得破坏父类契约,需满足前置条件不增强、后置条件不削弱、不变量守恒等准则。

什么是里氏替换原则_java oop设计行为规范说明

里氏替换原则(Liskov Substitution Principle,简称 LSP)是 Java 面向对象设计中六大核心原则之一,它的核心就一句话:子类对象必须能够替换父类对象,且程序行为不发生改变。换句话说,只要代码里用到了父类类型的地方,换成它的任意合法子类实例,运行结果应该完全一致、不出错、不反逻辑。

它解决什么问题

继承不是“能编译通过”就万事大吉。现实中常出现:父类方法语义清晰(比如 setHeight() 只改高不碰宽),子类一重写却悄悄联动修改了宽——外部调用者按父类契约使用,结果出 bug。LSP 就是给继承划一条底线:子类不能偷偷破坏父类已承诺的行为规则。

常见违反场景包括:

  • 子类重写父类非抽象方法时,改变了原逻辑(如把“计算原价”改成“返回折扣价”)
  • 子类覆盖父类方法后,对入参做了更严格的校验(父类允许 null,子类拒绝 null)
  • 子类重写后返回类型变宽松(父类返回 ArrayList,子类返回 List 看似合理,但若调用方用了 ArrayList 特有方法就会崩)
  • 用正方形继承矩形:父类有 setWidth()setHeight(),子类重写后两个方法都强制同步边长——这违背了矩形“宽高可独立设置”的隐含契约

怎么才算合规

关键不是“能不能继承”,而是“替换了是否还稳得住”。判断依据很实在:

西语写作助手
西语写作助手

西语助手旗下的AI智能写作平台,支持西语语法纠错润色、论文批改写作

西语写作助手 21
查看详情 西语写作助手

立即学习Java免费学习笔记(深入)”;

  • 前置条件不增强:子类方法的输入约束不能比父类更严(比如父类接受任意正整数,子类不能只接受 1~100)
  • 后置条件不削弱:子类方法的输出结果、异常范围、副作用等,不能比父类承诺得更少或更松(比如父类保证返回非 null,子类就不能返回 null)
  • 不变量要守住:父类定义的业务不变量(如“余额不能为负”“ID 一旦设置不可变”),子类必须同样维护
  • 不要覆盖已有实现:对已有具体方法,优先新增方法(如 getDiscountPrice()),而不是重写 getPrice() 改含义

实际开发中的提醒

LSP 不是理论清规戒律,而是帮你提前避坑的实践指南:

  • 写父类时,把方法契约写清楚(JavaDoc 注明参数范围、返回含义、可能异常)
  • 写子类前,先问一句:“如果现在所有父类变量都换成我这个子类,现有测试还全过吗?”
  • 发现子类很难“干净”继承时,别硬扛——考虑用组合(has-a)代替继承(is-a),比如让“正方形”持有“边长”字段,而不是继承“矩形”
  • 单元测试里,可以用子类实例直接替换父类参数做回归验证,这是检验 LSP 最直接的方式

基本上就这些。它不复杂,但容易忽略;守住了,继承才真正成为助力,而不是埋雷工具

以上就是什么是里氏替换原则_Java OOP设计行为规范说明的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号