1、抽象过程
a) 人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。 可见抽象是多么重要啊!
b) 非OO语言:所作的主要抽象是仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来考虑。程序员必须建立起在机器模型和实际待解问题的模型之间的关联。
c)OO语言:根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。这种思想的实质是——程序可以通过添加新类使自身适用于某个特定的问题,而不再被迫只能使用现有的数据类型。
d)OO的五个特性:
i. 万物皆为对象
ii.程序是对象的集合,它们通过发送消息来告知彼此所要做的
iii.每个对象都有自己的由其他对象所构成的存储
iiii.每个对象都拥有其类型
iiiii.某一特定类型的所有对象都可以接收同样的消息。
2.每个对象都有一个接口
a) 类描述了具有相同特性(数据元素)和行为(功能)的对象的集合,所以一个类实际上就是一个数据类型
b) 程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型。
c) 接口确定了对某一特定对象所能发出的请求。此过程通常被概括为:向某个对象“发送消息”(产生请求),这个对象便知道此消息的目的,然后执行对应的程序代码。
3.每个对象都提供服务
a)当试图开发或理解一个程序时,最好的办法之一就是将对象想像为"服务提供者"
b) 将对象看作是服务提供者还有一个好处,就是有助于提高对象的内聚性。在良好的面向对象设计中,每个对象都可以很好地完成一项任务,但是它并不试图做更多的事
4.被隐藏的具体实现
a)将程序开发人员按照角色分为类的创建者和客户端程序员是大有裨益的。
b)访问控制的第一个存在原因是让客户端程序员无法触及它们不应该触及的部分,第二个原因是允许库设计者可以改变内部的工作方式而不用担心会影响到客户端程序员。
5.复用的具体实现
a)代码复用是面向对象程序设计语言所提供的最了不起的优点之一。最简单复用某个类的方式就是使用该类的一个对象,此外也可以将现有类置于某个新类中。
b)使用现有类合成新的类,称为组合,如果组合是动态发生的,则称为聚合
c)组合经常被视为"has-a"(拥有)关系
d)在建立新类时,应该首先考虑使用组合而不是继承,因为组合更加简单灵活,继承一般应用在多态中。
6.继承
a)“是一个”(is-a):指的是继承应该指覆盖基类的方法(而不添加基类中没有的方法)。结果是子类可以完全替换基类,这被视为纯粹替换,称之为替换原则
b)“像一个”(is-like-a)指的是继承时添加新的方法,这种替换不完美,因为基类无法访问子类新添加的方法
c)应该优先使用替换原则,而”像一个“的用法也是不可避免的。只要仔细审视,两种方法的使用场合应该是相当明显的。
7.伴随多态的可互换对象
a)在处理类型的层次结构时,经常想把一个对象不当作它所属的特定类型来对待,而是将其当作其基类的对象来对待。这使得人们可以编写出不依赖特定类型的代码。
b)通过导出新的子类型而轻松扩展设计的能力是对改动进行封装的基本方式之一。开放封闭原则
c)非OOP:编译器能够确定被调用方法的绝对地址,但是OOP程序直到运行时才能够确定代码的地址。那么是如何实现将消息发送到泛化类型时,消息实际上是发送给了特定的类型的呢?面向对象语言其实是用了后期绑定的概念,当向对象发送消息时,被调用的代码直到运行时才能被确定。
d)为了执行后期绑定,Java使用一小段特殊的代码来替代绝对地址的调用。这段代码使用在对象中存储的信息来计算方法体的地址。
e)C++用virtual关键字来标识一个方法具有后期绑定功能,而Java中,动态绑定时默认行为。
8.单根继承结构
a)Java中所有的类都继承自单一的基类:Object
b)进行完全的面向对象程序设计时,构建继承体系是很重要的,这样做会带来OOP语言内置的很多便利。Java的继承体系中,根类就是Object,也就是所谓的"单根",所以Java相对C++来说有些操作的实现是容易很多的,例如垃圾处理机制。
c)单根继承结构的好处:保证所有对象都具有某些功能;参数传递得到了极大的简化;单根继承结构使垃圾回收器的实现容易很多;由于所有的对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局,这对于系统级操作(如异常处理)显得尤为重要,并且给编程带来了极大的灵活性。
9.容器
a)不同的容器提供了不同的类型的接口和外部行为;不同的容器对于某些操作具有不同的效率。
9.1参数化类型
a)在Java SE5之前,容器存储的对象都只具有Java中的通用类型:Object
b)将对象置于容器时,它必须被向上转型为Object,这会丢失身份;当把它取回时,得到的是Object的引用,所以怎样才能获得置入容器中时的具有实用类型的对象呢?这时候就要用到向下转型,然而除非确切知道所要处理的对象的类型,否则向下转型几乎是不安全的。为了支持向下转型,从容器中取出对象时必须以某种方式记住这些对象的类型,这样才能执行正确的向下转型的。还有,向下转型和运行时检查需要额外的程序运行时间,也需要程序员付出更多的心血(的确是,有时候会报类型转换异常,这很难避免,只有到运行期间才能知道是否正确),那么创建一种容器,它知道自己所保存的对象的类型,从而不需要向下转型以及消除犯错误的可能,这样不是很有意义吗?(是的,非常有意义,开始明白范型的好处了,嘻嘻),这种解决方案称为参数化类型机制。
c)Java SE5的重大变化之一就是增加了参数化类型,在java中称为范型。
10.对象的创建和生命期
a)在使用对象时,最关键的问题之一便是它们的生成和销毁方式。
b)Java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例
c)Java是在堆上创建对象的。这种方式,需要创建多少个对象,它们的生命周期如何,以及它们的类型是什么等只能在程序运行时相关代码被执行到的那一刻才能确定。
11.异常处理
a)异常是一种对象,它从出错点被"抛出"
b)异常处理就像是与程序正常执行路径并行的另一条路径
c)异常提供了一种从错误状况进行可靠恢复的途径,现在不再时只能退出程序,你可以经常进行校正,并恢复程序的执行,这些都有助于编写出更健壮的程序。
12.并发编程
a)通过将一个问题切分成多个可独立运行的部分(任务),从而提高程序的响应能力。在程序中,这些被独立运行的部分称之为线程,上述概念被称为”并发“。
b)并发有一个隐患:共享资源。如果有多个并行任务都要访问同一项资源,就会出现问题。所以解决办法是,当该资源被一个并行任务访问时应该锁定,完成任务,然后释放锁,使其他任务可以使用这项资源。