新闻中心
OOP中的里氏替换如何在代码中体现_J*a继承规范说明
里氏替换原则要求子类能安全替换父类而不破坏程序正确性,强调行为契约、前置/后置条件、不变量、构造逻辑及副作用控制,而非仅语法兼容。

里氏替换原则(Liskov Substitution Principle, LSP)不是“能编译通过就行”,而是要求子类对象在任何父类出现的地方,都能不改变原有程序正确性地替换父类对象。它本质是对继承关系的语义约束,不是语法检查,J*a 编译器不会报错,但违反时运行结果可能出人意料。
方法签名一致,且行为契约不变
子类重写父类方法时,不能缩小访问权限(如父类 public,子类不能改为 protected),也不能抛出父类方法没声明的新受检异常。更重要的是:方法的前置条件不能增强,后置条件不能减弱。
- 比如父类
withdraw(double amount)允许取任意正数,子类不能加限制“只允许取整数元”——这会破坏调用方假设 - 父类约定“返回非 null 账户对象”,子类就不能返回
null或抛出未声明异常
子类不能破坏父类的不变量(invariants)
父类维护的关键状态规则,子类必须严格遵守。例如:
父类Rectangle 有 width 和 height,面积 = width × height;子类
Square 继承它并让 setWidth() 同时设 height,看似合理,但会导致 area() 行为不可预测——当外部代码按矩形逻辑调用 setHeight(2); setWidth(3);,期望面积是 6,实际却得 9。
这种设计违反 LSP,应避免用继承表达“正方形是矩形”的数学关系,改用组合或接口更稳妥。
立即学习“J*a免费学习笔记(深入)”;
晓象AI资讯阅读神器
晓象-AI时代的资讯阅读神器
72
查看详情
构造逻辑需兼容父类预期
子类构造器必须确保对象创建后即满足父类定义的有效状态。例如:
- 父类
Person要求name非空,子类Student构造时若允许传入空字符串并静默处理,就破坏了该不变量 - 父类初始化中依赖某个字段已就绪,子类重写被调用的初始化方法时,不能跳过或延迟关键赋值
多态调用下,子类不应引入意外副作用
如果父类方法设计为“只读”或“幂等”,子类重写时不应偷偷修改状态或产生可观测副作用。例如:
父类getData() 文档注明“不修改内部缓存”,子类若在其中触发刷新并清空旧数据,下游依赖该行为的代码就可能失效。
这类问题往往在单元测试中暴露——用父类类型声明、子类实例赋值,再跑父类原有测试用例,若失败,大概率是 LSP 被破坏。
基本上就这些。LSP 不是教条,而是提醒你:继承不是为了“少写代码”,而是为了“可安全替换”。设计时多问一句:“别人拿我这个子类去换父类,会不会懵?” —— 答案是否定的,才真正符合里氏替换。
以上就是OOP中的里氏替换如何在代码中体现_J*a继承规范说明的详细内容,更多请关注其它相关文章!
# 都能
# 武宁综合网站建设哪家好
# 属于您自己的网站建设
# 咸阳抖音关键词搜索排名推广
# 宜春网站建设找哪家
# 快速认识seo
# 宝山seo优化怎么合作
# 朝阳公园企业网站建设
# 如何免费优化网站
# 应聘seo简历
# 西北seo排名怎么收费
# java
# 一句
# 的是
# 转成
# 抛出
# 如何在
# 多态
# 不应
# 重写
# 子类
# lsp
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
必由学在线入口 必由学网页版快速登录入口
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
Lar*el递归关系中排除子孙节点的策略
如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流
学习通网页版快速入口 学习通官网网页版直接打开
c++如何实现单例设计模式_c++线程安全的单例模式写法
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
Python实时数据流中的动态最值查找策略
Python Socket多播通信中指定源IP地址的实践指南
React Router v6 教程:构建认证保护的私有路由与重定向策略
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
必由学官网首页入口 必由学教师网页版登录指南
12306怎么选座位选到安静区_12306选座安静区域选择策略
win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法
微信网页版官方入口教程 微信网页版网页版快速登录步骤
CSS图片焦点样式实现教程:理解与应用tabindex属性
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
内存检查:在VS Code中调试C++时的内存视图
Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南
Go语言中的*string:深入理解字符串指针
一加 14R 快充无反应_一加 14R 充电优化
126邮箱账号注册 电脑版登录入口
AO3最新镜像入口 Archive of Our Own官方平台访问
如何使 Jest 模拟函数默认抛出错误以提高测试效率
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
Spring Boot嵌入式服务器与J*a EE:功能支持深度解析
age动漫网站入口 age动漫官网直接访问入口
Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践
Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
免费抖音短视频入口_抖音网页版短视频免费通道
字由网在线版登录地址 字由网网页版安全入口
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
excel如何生成目录 excel一键生成工作表目录超链接
c++如何使用Meson构建系统_c++比CMake更快的构建工具
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
Composer如何解决json扩展缺失的错误
b站如何看历史记录_b站观看历史找回方法
b站赚钱渠道_b站收益来源
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持
c++中为什么推荐使用using替代typedef_c++现代化类型别名
J*a 递归快速排序中静态变量的状态管理与陷阱


2025-12-16
浏览次数:次
返回列表