1.2 每个对象都有一个接口
类描述了具有相同特性(数据元素)和行为(功能)的对象的集合,所以一个类就是一个数据类型。
如:
Light lt=new Light();
lt.on();
定义对象的“引用lt”,用new方法创建新对象,向lt对象发送消息请求。
接口确定了某一特定对象所能发出的请求。
此过程:向某个对象“发送消息”(产生请求),这个对象便知道此消息的目的,然后执行对应的程序代码。
请求—- 关联 —-方法
1.3 每个对象都提供服务
高内聚 。
1.4 被隐藏的具体实现
角色:类型创建者 ,客户端程序员(消费者)。
访问控制:
public : 任何人可用
private : 除类型创建者和内部方法之外,皆不可用
protected : 与private相当,差别在于继承的类可以访问protected成员,但不能访问private成员。
无修饰词时,默认包访问权限,可访问同一包中的其他类成员,包之外,同private。
1.5 复用具体实现
某个类直接使用该类的一个对象,或者该类对象置于某个新类中(创建一个成员对象)。
使用现有类合成新的类—组合。如果组合式动态发生的—-聚合。
组合—–“has a”(拥有)关系,如汽车拥有引擎。
1.6 继承
基类和导出类产生差异方法:
(1)导出类添加新方法
(2)覆盖
判断继承关系:
(1)只覆盖基类方法 则视为纯粹替代,称替代原则
是否可用is-a(是一个)描述。“圆形是一个几何图形”
(2)导出类添加类新的方法,扩展类接口
描述为is-like-a(像是一个)
1.7 伴随多态的可互换对象
BirdControler对象仅处理泛化的Bird对象
但当move()调用时,可产生正确的行为。
为什么?
非面向对象的编译器对于函数调用使用前期绑定。使用绝对地址。
OOP中采用后期绑定。编译器确保被调用方法的存在,对调用参数和返回值执行类型检查,但不知将被执行的确切代码。使用小段特殊代码替代绝对地址调用。
向上转型:
把导出类看成基类的过程。
//1、仅和基类交互,不知做什么,总是做了该做的。
void doSomething(Shape shape){
shape.erase();
shape.draw();
}
//2、其他类
Circle circle=new Circle();
Line line=new Line();
doSomething(circle);
doSomething(line);
//doSometing()可以自动的正确的处理不同的具体类型。由于多态。