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
使用范例







网友评论