java 里面里氏替换原则的疑惑?
刚开始学习 java
, 接触到里氏替换原则
这个概念的时候查阅了一下资料, 其中有一条如下:
当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
但是本人自己写了一个小demo
测试了一下, 当子类方法形参比父类方法形参输出严格时, 貌似使用子类替换父类也不影响程序逻辑, 代码如下:
import java.util.HashMap;
import java.util.LinkedHashMap;
public class Test {
public static void main(String[] args){
HashMap map = new HashMap();
A a = new A();
a.f(map); // 父类
B b = new B();
b.f(map); // 父类
}
}
class A {
public void f(HashMap map) {
System.out.println("父类");
}
}
class B extends A {
public void f(LinkedHashMap map) {
System.out.println("子类");
}
}
可以看到当我使用子类B
替换掉父类A
, 同时子类的参数类型LinkedHashMap
比父类参数类型HashMap
更严谨(与里氏替换原则要求相反), 但是结果似乎并不影响(还是输出"父类", 而不是"子类").
个人觉得这个相当于在子类里面重载了父类的方法(不同的参数类型), 所以不是很理解到底该如何实践这一原则, 如果哪位前辈可以指点一下(有具体代码更好), 不胜感激!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现.
如一个方法接受 Map 做为参数, 那一定可能接受 Map 的子类或实现类, 如 HashMap, LinkedHashMap 等等.
如果一个方法以 LinkedHashMap 为参数, 那么不能用HashMap 给他传参.
里氏替换原则是为了更好的实现继承和多态, 你这个是函数重载
正确的继承是可以用
@Override
注解, 可以调用super.parentClassMathod
.