我们可以把自然界分解为各种概念并且定义分类 Java就是一种程序的分类。
计算机是我们头脑的延伸的工具,并不能代替我们的大脑思考。它本身也是一种不同类型的表达媒体
1.1 抽象过程
所有的编程语言都提供抽象的机制。解决问题的复杂性直接取决于抽象的类型和质量
传统的抽象的思考方式:解决问题时要基于计算机的结构,而不是基于所要解决问题的结构来考虑。程序员必须建立起在计算机模型和实际待解决问题的模型直接的关联。
名词解释:
解空间:就是你对问题建模的地方,如计算机
问题空间:就是问题存在的地方,如一项业务
面向对象的的方式通过向程序员提供表示问题空间中的元素的工具而更近一步。这种表示不受限于任何特定问题的限制,将问题空间中的元素及其在解空间中表示称为“对象”。
实质:程序可以通过添加新类型的对象使自身适用于某个特定问题。因此,当你阅读描述解决方案问题的代码的同时,也在阅读问题的表述。OOP可以根据问题来表述问题。
面向对象程序设计的特性
1)万物皆对象 对象是一种特殊的变量,可以存储数据,也可以进行自身的操作。可以抽取待求解问题的任何概念化的构件,将其表示为程序中的对象。
2)程序是对象的集合,它们通过发送消息来告知彼此所要做的。请求对象就是发送一条消息,把消息想成对某个特定对象的方法的调用请求.
3)每个对象都有自己的由其他对象所构成的存储 通过创建包含现有对象的包的方式来创建新的对象(是不是指后面的类的组合使用?)
4)每个对象都拥有类型 每个对象是某个类的实例(instance), 类==类型 ,类之间的区别在于 可以发送什么消息给它(对象)
5)某一特定类型的所有对象都可以接收同样的消息 对象具有状态、行为、 标示。
1.2 每个对象都有一个接口
具有相同的特性和行为的对象归属为类的一部分。面向对象程序设计语言都使用class来表示数据类型。
类描述了具有相同特性(数据元素)和行为(功能)的对象集合。面向对象方法不仅局限于构建仿真程序,即任何程序都是你所设计的系统的一种仿真。
接口确定了对某一特定对象所能发出的请求,即类的作用和类的提供的功能。
1.3 每个对象都提供服务
理解和开发程序时,最好将对象想象为“服务提供者”,程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的,目标就是去创建能够提供理想的服务来解决问题的一系列对象。
“如果我可以将问题从表象中抽取出来,那么什么样的对象可以马上解决我的问题呢?”
如薄记系统=输入屏幕对象+执行计算的对象集合+处理不同打印机上打印发票和开发票对象
简化 :所有支票排版的目录+通用的打印接口
我们的任务就是通过这种对现实问题的思考,转化一组或多组的合理对象的集合,思考点在对象之间的组合上。
1.4 被隐藏的具体实现
开发人员角色划分:类创建者+客户端程序员
客户端程序员目标:收集各种用来实现快速应用开发的类。
类创建者:构建类 这种类只向客户端程序员暴露必需的部分,而隐藏其他的部分。
类的访问权限:public(所有类访问),private(本类),protected(本类和子孙类),缺省default(同一个包内)
1.5 复用具体实现
复用某个类就是直接使用该类的对象,可以将那个类的一个对象置于某个新类中.“创建一个成员对象”。
新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能方式所组成。即在使用现有的类合成新的类的概念--组合。has-a(拥有)
1.6 继承
对象:通过概念将数据和功能封装到一起,可以对问题空间的观念给出恰当的表示,而不受制于必须使用的底层的机器语言.
继承就是构建一种类层次结构,将具有相似功能的类发到一起使用.相同的方法执行不同的功能。
构建解决模型:对象+类层次的结构。
基类和导出类的差异应用
1) 直接在导出类添加新的方法
2) 改变现有基类的方法的行为--覆盖(is-a ,is-like-a)
1.7 伴随多态的可互换对象
处理类型的层次结构中,把对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待,可以编写出不依赖于特定类型的代码。这样的代码不会受到新添加类型的影响,即通过导出类的子类型可轻松扩展设计能力。
把将导出类看做是它的基类的过程--向上转型 转型为一个基类就是导出类在继承图中向上移动 这种类型的3个特性
1.8 单根继承结构
所有对象都有一个共用的接口,可以保证所有的对象都具备某些功能。
1.9 容器
容器:创建一种对象类型,这种新的对象类型持有对其他对象的引用(也可以使用数组).
这种容器可在任何需要时扩充自己以容纳你置于其中的所有东西。
OOP容器List(存储序列),Map(关联数组,用来建立对象的之间的关联),Set(每种对象类型只持有一个).
容器选择:1) 不同容器提供了不同类型的接口和外部行为。
2) 不同容器对于某些操作具有不同的效率。
1.9.1 参数化类型(容器)
容器存储的对象都只具有Java中的通用类型:Object.单根继承结构意味着所有东西都是Object类型,所以可以存储Object的容器的任何东西。
但是我们将对象置入容器时,它必须向上转型Object,会丢失身份,取回是就是一个对Object的引用,要取回具有实用接口的对象?
参数化类型(泛型):创建这样的容器,知道自己所保存对象的类型 而不需要向下转型和消除错误