uml结构图讲解(概述耦合UML)
uml结构图讲解(概述耦合UML)④ 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等父类: speaking方法被调用 子类: speaking方法被调用public class Father { public void speaking(List list) { System.out.println("父类: " list.get(0)); } } 复制代码子类 Sonpublic class Son extends Father { public void speaking(ArrayList arrayList) { System.out.println("子类: " arrayList.get(0)); } } 复制代码测试类 Test
运行结果:
父类: speaking方法被调用 父类: speaking方法被调用
如果我们将范围颠倒一下,将父类方法参数范围设大一些,子类方法参数设小一些,就会发现我明明想做的是重载方法,而不是重写,但是父类的方法却被执行了,逻辑完全出错了,所以这也是这一条的反例,并不满足里氏替换原则
父类 Father
public class Father {
public void speaking(List list) {
System.out.println("父类: " list.get(0));
}
}
复制代码
子类 Son
public class Son extends Father {
public void speaking(ArrayList arrayList) {
System.out.println("子类: " arrayList.get(0));
}
}
复制代码
测试类 Test
public class Test {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("speaking方法被调用");
// 直接调用父类运行的结果
Father father = new Father();
father.speaking(arrayList);
// Son子类替换父类运行的结果
Son son = new Son();
son.speaking(arrayList);
}
}
复制代码
运行结果:
父类: speaking方法被调用 子类: speaking方法被调用
④ 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等
父类中定义一个抽象方法,返回值类型是 List,子类中重写这个方法,返回值类型可以为 List,也可以更精确或更严格,例如 ArrayList
父类 Father
public abstract class Father {
public abstract List speaking();
}
复制代码
子类 Son
public class Son extends Father {
@Override
public ArrayList speaking() {
ArrayList arrayList = new ArrayList();
arrayList.add("speaking方法被调用");
return arrayList;
}
}
复制代码