快捷搜索:  汽车  科技

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)); } } 复制代码

uml结构图讲解(概述耦合UML)(1)

子类 Son

public class Son extends Father { public void speaking(ArrayList arrayList) { System.out.println("子类: " arrayList.get(0)); } } 复制代码

uml结构图讲解(概述耦合UML)(2)

测试类 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); } } 复制代码

uml结构图讲解(概述耦合UML)(3)

运行结果:

父类: speaking方法被调用 子类: speaking方法被调用

④ 当子类的方法实现父类的方法时(重写/重载或实现抽象方法),方法的后置条件(即方法的的输出/返回值)要比父类的方法更严格或相等

父类中定义一个抽象方法,返回值类型是 List,子类中重写这个方法,返回值类型可以为 List,也可以更精确或更严格,例如 ArrayList

父类 Father

public abstract class Father { public abstract List speaking(); } 复制代码

uml结构图讲解(概述耦合UML)(4)

子类 Son

public class Son extends Father { @Override public ArrayList speaking() { ArrayList arrayList = new ArrayList(); arrayList.add("speaking方法被调用"); return arrayList; } } 复制代码

uml结构图讲解(概述耦合UML)(5)

猜您喜欢: