重载时里氏替换原则

来源:3-10 里氏替换原则coding

坏淡一个

2018-12-15

父类:

public class Base {
    public void method(Map map) {
        System.out.println("父类入参方法");
    }
}

子类:

public class Child extends Base {
    public void method(HashMap map) {
        System.out.println("子类HashMap入参方法被执行");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        Map map = new HashMap();
        child.method(map);
    }
}

执行结果:父类入参方法
这样看,子类比父类输入参数更窄,并没有比父类宽松,也不违反里氏替换原则啊

写回答

2回答

geelylucky

2018-12-23

同学,你好,我是geely老师的助教。

关于你这个问题,其实Base类中的method和Child里面的method是两个没有任何关联的方法哦,只是因为它们名字相同而已,method(HashMap map)是你在子类中增加的特有方法,并不是重载类Base类的method方法,请同学详细了解一下java的重载机制哦。

如果还有其他疑问,请留言告知。

希望能帮助到你。

2
3
geelylucky
回复
kiglig
亲爱的同学,你理解的很对。棒棒哒!!!
2019-01-14
共3条回复

new_chapter

2019-03-15

我觉得这个问题很好,回答并没有让我完全理解这个问题。

Child类里的method其实是重载了继承自Base的method方法。说是两个不同的方法也对。

既然按照两个不同的方法去理解,那么就取决于应用是怎么去调用的。如果Test类中传入参数是Map,则调用更宽松参数的那个方法;如果Test类中传入HashMap,则调用更严格参数的方法。

既然取决于调用的方式,如果调用的参数和父类保持一致,那么就符合里氏替换原则吧?

那么为什么在子类中实现更宽松参数的方法 要比 在父类实现更宽松参数的方法高明呢?

0
1
慕粉2463618
说2个不同方法没啥毛病,根据传参的不同调用不同的方法,但是他们是继承关系,子类应该在父类的基础上进行扩展,如果子类的传参比父类更加严格,那么父类就失去了类似作为基类的作用吧。应该是因为规范的问题吧?
2022-02-28
共1条回复

Java设计模式精讲-Debug方式+内存分析

系统学习设计原则,设计模式,锤炼编码内功,赢取高薪Offer

3430 学习 · 407 问题

查看课程