[软件构造] 7 OOP
[软件构造] 7 OOP
目标:将ADT的接口从实现分离出来,使用 Java
接口类型来强制这种分离。
用接口定义ADT,写实现接口的类。
用OOP/接口/类 实现ADT
大纲:
OOP的基本概念:object, class, attribute, method, interface, enumeration
OOP的显著特性:
Encapsulation and information hiding 封装与信息隐藏
Inheritance and overriding 继承与重写
Polymorphism, subtyping and overloading 多态、子类型、重载
*Static and Dynamic dispatch 静态与动态分派 (没讲)
Java里的一些重要的对象方法
设计好的类
OOP的历史
Summary
1 Basic concepts: object, class, attribute, and method
类成员变量、方法 vs 实例成员变量、方法:
类:用类名.方法名调用方法。
实例:从类的一个实例引用方法和变量。
使用类方法、类变量不用创建对象。
2 Interface
Interface和Class: 定义和实现ADT
接口:
由class
实现,在 class
的实现部分要声明这个接口,并且提供这个接口的所有的方法。
- a list of method signatures, but no method bodies.
- 接口之间可以继承与扩展
- 一个类可以实现多个接口(从而具备了多个接口中的方法)
- 一个接口可以有多种实现类
接口:确定ADT规约
类:实现ADT
也可以不需要接口直接使用类作为ADT,这个类中既有ADT定义也有ADT实现
实际中更倾向于使用接口来定义变量:
– Use interface types for variables and parameters unless you know one implementation will suffice.
– Supports change of implementation;
– Prevents dependence on implementation details
改变了一下记笔记的策略,碰到了没记住的、重要的东西再记下来。
接口不能有 constructor
。必须直接调用某个具体类中的 constructor
。
接口的实现要满足接口的规约。
接口定义中没有包含constructor,也无法保证所有实现类中都包含了同样名字的constructor。故客户端需要知道该接口的某个具体实现类的名字
使用静态工厂方法:
接口中的每个方法在所有类中都要实现,用default
字样可以在接口中统一实现某些功能,无需在各个类中重复实现它。----以增量式的为接口 增加额外的功能而不破坏已实现的类。
3 Inheritance and Overriding
方法默认可重写。
严格继承:子类只能添加新方法,无法重写超类中的方法。
设置方法不能重写:用 final
标识。
重写的函数:signature
相同。 The same name, same parameters or signature, and same return type.
实际执行时调用哪个方法,运行时决定。对象类型是parent class | subclass,调用的方法会执行对应的class中的方法。
父类型函数实现体为空,则在每个子类中均需要重写。
可在子类重写的函数实现体中调用super()
复用父类型中的函数。
可在一个constructor中调用同一个类中的另一个constructor或者调用superclass中的constructor, 但是这两种情况调用的别的地方的constructor必须在此constructor的第一行。