老师,能解释一下最后两条原则吗

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

jiangkerLove

2019-10-24

在视频大概15.40秒的时候,你把基类的入参换成了Map,然后子类中用重载了HashMap入参,在主程序中为

		Child child = new Child();
		HashMap hashMap = new HashMap();
		child.method(hashMap);

这个时候,子类中有父类继承下来的入参为Map的方法和自己重载的HashMap方法,这时用子类调用的方法为自己HashMap方法,这里并没有什么问题呀,因为执行是先使用满足条件的范围更小的那个方法。然后我想正常使用的时候大多都是向上转型为base之后去执行方法,所以

        Base child = new Child();
        HashMap hashMap = new HashMap();
        child.method(hashMap);

这样执行的方法又是父类中的方法了,因为子类只是重载而不是重写了方法。所以我在思考这条原则的意义在于什么,然后我在想,放大子类入参的范围难道是为了在向上转型之后,可以传入Map调用子类自己的方法吗?但是这样显而易见的是不可行的,因为根本不能传入这样的参数呀。反倒是在这种父类是Map的情况下,如果主程这样更改,

        Child child = new Child();
        Map hashMap = new HashMap();
        child.method(hashMap);

依然执行的会是父类中继承过来的方法,所以我不明白什么里氏替换,不管重载范围增大还是缩小,都是默认执行较小范围的HashMap呀,希望老师能给我讲一下这个原则到底干什么的?

然后对于第四个原则,这不应该是Java的特性吗?因为既然是实现,假设返回值可以比基类的返回值类型大,那么在向上转型之后,实际调用的方法是子类重写的方法,此时返回的对象Object让原本Map对象根本没办法接收,所以不可能增大返回值类型呀,所以这是Java约束怎么又是一个设计原则了?

写回答

1回答

geelylucky

2019-10-24

同学,父类的入参是HashMap://img1.sycdn.imooc.com/szimg/5db19aa109b1cfaa13260504.jpg

看一下这篇博客:https://blog.csdn.net/u012060033/article/details/90716446


0
1
jiangkerLove
在那个时候你把HashMap换成了Map的呀,然后子类缩小父类的范围,我指的是这里,依然可以调用父类的方法呀
2019-10-24
共1条回复

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

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

3430 学习 · 407 问题

查看课程