里氏替换原则(LSP)是设计契约,要求子类对象可无损替换父类对象:前置条件不得强化、后置条件不得弱化、行为与副作用须一致;违反案例包括正方形继承长方形、企鹅继承鸟类等;践行要点为优先抽象/接口、避免重写公开方法、用模板方法、明确契约文档、执行子类替换测试。

里氏替换原则(Liskov Substitution Principle,简称 LSP)不是语法规定,而是一条设计契约:只要代码中用到了父类类型的地方,换成它的任意子类对象,程序逻辑必须依然正确、行为不能改变。
Java 编译器允许子类重写父类方法,但 LSP 要求这种重写不能破坏原有语义。比如:
withdraw(double amount) 方法扣款成功后更新余额并返回 true,子类若重写为“余额不足也返回 true 但不扣款”,就违反了行为一致性。这些例子在真实项目里高频出现,容易被忽略:
setWidth() 和 setHeight(),但正方形重写这两个方法强制宽高同步。结果:传入 Rectangle r = new Square() 后调用 r.setWidth(5); r.setHeight(3),实际得到的是边长为 3 的正方形,面积从预期的 15 变成 9;Bird 有 fly() 方法,Penguin 重写为抛异常或空实现,那么所有面向 Bird 编写的飞行调度逻辑(如 if (bird.canFly()) bird.fly();)在传入企鹅时就会出错或跳过关键流程;saveUser() 只写数据库,子类重写后额外发短信、改缓存、触发异步任务——调用方没预料到这些动作,可能造成重复通知或事务不一致。关键不是“能不能继承”,而是“该不该用继承”。推荐做法:
立即学习“Java免费学习笔记(深入)”;
LSP 是多态真正可用的前提。没有它,List<animal> animals = Arrays.asList(new Dog(), new Cat()); animals.forEach(Animal::makeSound);</animal> 这样的代码就只是语法糖,运行时可能一个叫得欢、一个静默、一个抛异常。它也是开闭原则(对扩展开放、对修改关闭)的支撑:只有子类能安全替换父类,你才能放心加新子类而不动老代码。
以上就是在Java里什么是里氏替换原则_里氏替换在Java继承中的体现解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号