cs61b2018sp WEEK4.3 子类型多态 VS高阶函数

2022-03-26  本文已影响0人  且乐一杯酒

2022.3.27

WEEK4.3 子类型多态 VS高阶函数

一、内容

1.动态选择小热身~




第一行,o2指向动态类型ShowDog
第二行,o2强制转换后,静态类型变为ShowDog,左边和右边一样,第二行编译通过。且sdx动态类型为ShowDog(就是o2原先指向的实例)
第三行,因sdx动态类型为ShowDog类型,因为有bark方法,所以调用ShowDog的bark方法,没问题
第四行,左边右边静态类型一致,可编译,且dx动态类型为ShowDog
第五行,dx静态变量为Dog,且Dog有bark方法,可编译。dx动态类型为ShowDog,故调用ShowDog的Bark方法
第六行,o2投射为Dog后,有bark方法,编译通过。实际运行时,为动态类型ShowDog,调用ShowDog的方法
第七行,虽然静态类型不同,但有继承关系,可编译
最后一行,因为o3静态类型为Object,没bark方法,编译报错

2.子类型多态(Subtype Polymorphism)

max方法

观察如上代码,可见有一处错误,就是传入的要比较的元素不一定能用>来比较

解决方法一:



传入参数特别化,但明显这种不够泛用

解决方法二:


自己写的OurComparable接口

就是自己写一个接口,使其可以比较,具体实现代码就不贴了
但还是有一个缺点,就是如果和Dog无关的类(如没有继承关系)例如Cat、Horse,无法使用此接口

3.Comparable接口


类里实现了这个接口,记得泛型传参
重写接口方法
优化后的Maximizers

4.Comparator接口


注:需要导包java.util.Comparator
一般写在需要比较的类中,作为嵌套类,而且我们可见,里面的变量和外部类无关,故可用static。而且这里为了符合OOC规范,用了一个getXXX方法去隐藏这个Comparator
使用范例
上一篇 下一篇

猜你喜欢

热点阅读