第三章 ADT与OOP——4. 面向对象编程OOP

第三章ADT与OOP的知识清单:

1. 基本数据类型对象数据类型
2. 静态类型检查、动态类型检查
3. 值的改变、引用的改变
4. Mutable/Immutable
5. 防御式拷贝
6. snapshot diagram
7. specification、行为等价性
8. 前置后置条件
9. 规约的强度
10. ADT操作的四种类型
11. 表示独立性
12. 不变量、表示泄漏
13. 表示不变量RI、AF
14. 以注释的形式撰写AF、RI
15. 接口
16. 继承、override
17. 多态、overload
18. 泛型
19. 等价性equals()与==
20. equals()的自反、传递、对称

21. hashCode()

22. 可变对象的观察等价性、行为等价性


15. 接口

一种用于设计和表达ADT的语言机制,其实现方式是实现该接口的类。

接口(Interface)与类(class)之间的关系为定义ADT规约和实现ADT的关系。

注意,接口之间可以继承,一个类也可以同时继承多个接口。一个接口也可以由多种实现。具体的代码就自己尝试敲啦,网上也有很多例子就不多唠叨栗子啦。

其中值得一提的是,接口定义中没有构造器(construction),也无法保证所有实现类中都包含了同样名字的构造器,所以哭护短需要知道该接口的某个具体实现类的名字,其打破了抽象边界。

当然如果你是用的是java8以上的版本,其允许了在接口中包含静态方法,所以也就可以实现构造器制定一个实现。例如下面的栗子:



现在来说一下使用接口的优点,有点有很多,这里也仅仅是介绍一点而已:

  1. 当用户使用接口类型时,静态检查使他们只能够使用由接口定义的方法。如果用户看到了实现类的方法也就违反了表示独立性。
  2. 客户与维护人员确切的知道应该在哪里查找该ADT的规约,因为接口不包含实例的实现,所以更容易将实现的过程阻隔在规约外面。
  3. 通过增加实现接口的类,我们可以轻松的添加新类型的实现。

最后小小的谈一下抽象类:

抽象类:包含至少一个抽象方法的类称为抽象类。 

接口:一个只有抽象方法的抽象类。



抽象方法:具有signature但没有实现的方法(也称为抽象操作),由关键字abstract定义。 

Concrete class -> Abstract Class -> Interface


16. 继承、override

继承主要分为两种:普通的继承和严格继承。

普通继承不用解释,对于严格继承:子类中只能添加新方法,无法重写父类中的方法。要实现严格继承很简单,与在类前+final修饰禁止继承差不多,只需要在每个方法前用final修饰即可,前者禁止继承,后者禁止重写。

override:

重写的方法拥有完全相同的参数,方法名,返回值,但可视性可以扩大,但注意不能缩小,例如父类中修饰符为protected,那么子类重写方法修饰符可以为public,但不能为private。

至于重写时具体执行那个方法,在运行时决定。另外值得一提的是,重写方法切记不要改变原方法本意。


抽象方法:具有signature但没有实现的方法(也称为抽象操作),由关键字abstract定义。 


17. 多态、overload

多态:

首先谈一下多态的分类:

  1. 特殊多态(hot polymorphism):功能重载。
  2. 参数化多态(parametric polymorphism):泛型或泛型编程。
  3. 子类型多态 subtype polymorphism(包含多态 inclusion polymorphism):当一个名称表示许多不同的类与一些常见的父类相关的实例。
抽象方法:具有signature但没有实现的方法(也称为抽象操作),由关键字 abstract 定义。 

overload:

多个方法具有同样的名字,但有不同参数列表或返回值类型。

价值:方便客户端调用,客户端呢可用不同的参数列表调用相同的方法。

注意重载是静态多态,是在编译阶段时决定要具体执行哪个方法(静态类型检查),根据参数列表进行最佳匹配。与此不同,重写是在动态类型检查中,即运行阶段检查。

重载检查规则:



最后附上重写与重载对比:




18. 泛型(Generics)

其主要应用分为两种:

  • 泛型接口
  • 泛型方法

一些泛型的注意事项:


猜你喜欢

转载自blog.csdn.net/qq_37549266/article/details/80709569
今日推荐