打字猴:1.700454877e+09
1700454877 }
1700454878
1700454879 运行结果还是一样,看明白是怎么回事了吗?父类方法的输入参数是HashMap类型,子类的输入参数是Map类型,也就是说子类的输入参数类型的范围扩大了,子类代替父类传递到调用者中,子类的方法永远都不会被执行。这是正确的,如果你想让子类的方法运行,就必须覆写父类的方法。大家可以这样想,在一个Invoker类中关联了一个父类,调用了一个父类的方法,子类可以覆写这个方法,也可以重载这个方法,前提是要扩大这个前置条件,就是输入参数的类型宽于父类的类型覆盖范围。这样说可能比较理难理解,我们再反过来想一下,如果Father类的输入参数类型宽于子类的输入参数类型,会出现什么问题呢?会出现父类存在的地方,子类就未必可以存在,因为一旦把子类作为参数传入,调用者就很可能进入子类的方法范畴。我们把上面的例子修改一下,扩大父类的前置条件,源代码如代码清单2-15所示。
1700454880
1700454881 代码清单2-15 父类的前置条件较大
1700454882
1700454883 public class Father{
1700454884
1700454885 public Collection doSomething(Map map){
1700454886
1700454887 System.out.println(“Map转Collection被执行”);
1700454888
1700454889 return map.values();
1700454890
1700454891 }
1700454892
1700454893 }
1700454894
1700454895 把父类的前置条件修改为Map类型,我们再修改一下子类方法的输入参数,相对父类缩小输入参数的类型范围,也就是缩小前置条件,源代码如代码清单2-16所示。
1700454896
1700454897 代码清单2-16 子类的前置条件较小
1700454898
1700454899 public class Son extends Father{
1700454900
1700454901 //缩小输入参数范围
1700454902
1700454903 public Collection doSomething(HashMap map){
1700454904
1700454905 System.out.println(“HashMap转Collection被执行……”);
1700454906
1700454907 return map.values();
1700454908
1700454909 }
1700454910
1700454911 }
1700454912
1700454913 在父类的前置条件大于子类的前置条件的情况下,业务场景的源代码如代码清单2-17所示。
1700454914
1700454915 代码清单2-17 子类的前置条件较小
1700454916
1700454917 public class Client{
1700454918
1700454919 public static void invoker(){
1700454920
1700454921 //有父类的地方就有子类
1700454922
1700454923 Father f=new Father();
1700454924
1700454925 HashMap map=new HashMap();
1700454926
[ 上一页 ]  [ :1.700454877e+09 ]  [ 下一页 ]