1. 章首语:我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来……除非赞成这个协定中规定的有关语言信息的组织和分类,否则我们根本无法交谈。
2. 关于抽象过程:
a) 非OO语言问题:主要抽象仍要求在解决问题基于计算机的结构,而不是基于所要解决问题的结构来考虑;程序员必须建立起在机器模型和实际待解决问题的模型之间的关联;
b) OO:允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题;
c) OO的五个特性:
i. 万物皆为对象;
ii. 程序是对象的集合,通过发送消息来告知彼此所要做的;
iii. 每个对象都有自己的由其他对象所构成的存储;
iv. 每个对象都拥有其类型;
v. 某一特定类型的所有对象都可以接收同样的消息;
d) 总之,对象具有状态,行为和标识;
3. 每个对象都有一个接口:
a) 类描述了具有相同特性(数据元素)和行为(功能)的对象集合;
b) 程序员通过定义类来适应问题,而不再被迫只能使用现有的用来表示机器中的存储单元的数据类型;
4. 每个对象都提供服务:
a) 在良好的面向对象设计中,每个对象都可以很好的完成一项任务,但是它并不试图做更多的事;
5. 具体实现被隐藏:
a) 将程序开发人员按照角色分为类创建者(那些创建数据类型的程序员)和客户端程序员(那些在其他应用使用数据类型的类消费者)是大有裨益的;
b) Java的默认访问权限:包访问权限;包内可以访问;包外如同private类型;
6. 复用具体实现:
a) 组合:使用现成的类合成新的类;
b) 如果组合动态发生的,则被称为聚合;
c) 组合是“has-a”的关系;
d) 在建立新类时,应该首先考虑组合;
7. 继承:
a) 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛;
b) 覆盖:改变现有基类的方法的行为;
c) 继承应该只是覆盖基类的方法,而并不添加基类中没有的方法;(替代原则);
8. 伴随多态的可互换对象:
a) 常常不把一个对象当作它所属的特定类型来对待,而是将其当作基类的对象来看待;
b) 通过导出新的子类型而轻松扩展设计的能力是对改动进行封装的基本方式之一;
c) 后期绑定:程序直到运行时才能确定代码的地址;Java使用一小段特殊的地址来替代绝对地址的调用,这段代码使用在对象中存储的信息来计算方法体的地址;根据这段代码内容,当向一个对象发送消息时,该对象就能够知道这条消息应该做什么;
i. C++使用virtual关键字系统某个方法具备后期绑定属性所带来的灵活性;
ii. 而在java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态;
d) 向上转型:把导出类看作是它的基类的过程;正是多态才使得事情总是能够被正确处理,编译器和运行系统会处理相关问题的细节;
9. 单根继承结构:单根继承结构中,所有对象都具有一个共用接口;使垃圾回收器的实现变得容易得多;由于所有对象都保证具有相同的类型,因此不会因无法确定对象的类型而陷入僵局,这对于系统级操作(如异常处理)显得尤为重要,并且给编程带来了更大的灵活性;
10. 容器:
a) 容器种类多:
i. 不同容器提供了不同类型的接口和外部行为;
ii. 不同的容器对于某些操作具有不同的效率;
b) 除非确切知道所有处理的对象的类型,否则向下转型几乎是不安全的;
c) 参数化类型机制(泛型):
i. 参数化类型就是一个编译器可以自动定制作用于特定类型上的类;
ii. 称为泛型,例如:ArrayList<Shape> shapes = new ArrayList<Shape>();
11. 对象的创建和生命周期:
a) Java完全采用了动态内存分配方式,每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例;
b) Java两个特性:所有对象都是继承自单根基类Object;只能以一种方式创建对象(在堆上创建;
12. 异常处理:处理错误,异常提供了一种从错误状况进行可靠恢复的途径。你可以经常进行校正,并恢复程序的执行,这些都有助于编写出更健壮的程序;
13. 并发编程:注意处理共享资源;
14. Java与Internet:
15. 总结: