第一章 对象导论
1.1 抽象过程
面向对象程序设计(Object-oriented Programming OOP)五大特性:
(1)万物皆对象
(2)程序是对象的集合,它们通过发送消息来告知彼此所要做的
(3)每个对象(实例 instance)都拥有其类型(类 class)
(4)每个对象都有自己的存储空间,可容纳其他对象(通过封装现有对象,可制作出新对象)
(5)同一类所有对象都能接收相同的消息(e.g. 圆、形状属于同一类型)
1.2 对象的接口(Interface)
每个对象仅能够接受特定的请求。我们向对象发出的请求是通过它的“接口”定义的,对象的“类型”/“类”规定了它的接口形式。
1.3 每个对象都提供服务
- 软件设计基本质量要求——“高内聚”
- 每个对象只提供单项服务的内聚
1.4实体实现的隐藏
涉足OOP的人:
- 类创建者(创建新数据类型的人)
- 客户程序员(在自己的应用程序中采用现成数据类型的人)
访问控制原因:
- 防止程序员接触他们不该接触的东西(内部数据类型的设计思想)
- 允许库设计者修改内部结构,不用担心会对客户程序员产生什么影响
设置类边界:
- 显式:public(任何人均可)、private(除自己、类创建者及该类的内部函数,均不可访问)、protected(与private相似,但继承的类可访问)
- 隐式:friendly(默认),包访问权限
1.5 复用的具体实现
-
组合(composition): 由任意数量、任意类型的其他对象以任意可以实现新类的功能组成一个新类
-
继承:
(1)导出类与基类具有相同的类型(可向基类对象发送的所有消息亦可发送给衍生类对象)
(2)产生差异的方法:
①直接在导出类中添加新方法
②覆盖(尽管使用的函数接口未变,但它的新版本具有不同的表现) -
多态:
把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异。复制之后,父类型的引用可根据当前复制给它的子对象的特性以不同的方式运作——父亲的行为像儿子
e.g. 从一个基类中派生,响应一个虚命令,产生不同的结果 -
向上转型(upcasting):子类同时也是一个基类,具有基类的功能,向上转型成基类,实现符合自己的功能
-
动态绑定:自动根据传入的实际类型,采取相应的正确操作
-
抽象类(obstract):希望基础类只为自己的衍生类提供接口,不希望为基础类创建对象,让其使用自己的接口
-
接口(Interface):abstract的升级版,完全禁止了所有函数的定义
1.6 对象的创建和生命周期
创建对象:
- 堆栈:(静态存储区):在编写程序时知道对象确切的数量,生命周期和类型,牺牲了灵活性
- 堆:在内存池中动态创建对象,知道运行时才知道需要多少对象,无生命周期和类型
(一):集合(容器)和继承器(迭代器)
“集合”适用情形: 针对一个特定问题的解决,实现不知道要多少对象或持续时间,集合在需要时,会自动扩展自己
“继承器”适用情形: - 对集合中的一系列元素进操纵/比较,而不是仅仅面向一个
- 负责选择集合内的元素,并将其提供给继承器用户,允许我们遍历该序列
(二)单根结构
所有类最终都从单独的一个基础类继承——Object
- 所有对象都有一个通用接口,最终都属于相同的基本类型
- 可以方便地实现一个垃圾收集器(与此有关的必要支持放在根基础类里面)
(三)参数化类型
- 向上转型:Circle——>Shape(安全)
- 向下转型:Shape——>Circle(不安全)基类向下转型为更具体的类型
- 违例(Exception)——下溯时发生错误
- 如何将基类变回先前置入容器中时的具有实用接口
的对象?
参数化类型(泛型):ArrayList<Shape> =newArrayList<Shape>();
1.7 异常处理
与程序正常执行路径并行的,在错误发生时执行的另一条路径,不会干扰正常的执行代码,保证异常一定会在某处得到处理,提供了一种从错误状况进行可靠恢复的路径
1.8 并发编程(多线程)
- 单处理器:对实时性很高的任务,将问题划分进入独立运行的程序片段中,使整个程序能更迅速地相应用户请求——“假并行”
- 多处理器:每个任务指派给不同的处理器——“真并行”
- 【注】:“共享资源”过程:某个任务锁定某项资源,完成任务,释放资源锁,其他任务可用该资源(Java中的资源锁定方案:synchronized 关键字)