1: Introduction to Objects(对象简介)

抽象的过程
问题空间的元素同它在解决空间的表述称为“对象”。(此外还需要一些在问题空间并无对照的对象。)
面向对象的编程(Object-oriented programming,缩写是OOP)方法:
1. 万物皆对象。
2. 程序就是一组相互之间传递消息,告诉对方干些什么的对象。
3. 每个对象都利用别的对象来组建它自己的记忆。
4. 对象都有类型。
5. 所有属于同一类型的对象都能接受相同的消息。
对象有状态、行为和标识。

对象有接口
类是一组具有相同特征(数据元素)和行为(功能)的对象,所以实际上类是一种数据类型。
区别:类是程序员为解决特定问题而定做的,而数据类型是为了表示机器的存储单元而设计的,它是现成的,是程序员无可奈何时的选择。

对象会提供服务
优点:能提高对象的内聚性(cohesion)。内聚性高是高质量的软件设计的一个基本要求:就是说软件的各种组件(比如对象,也可以是方法或类库)应该能很好的“组装在一起”。

隐藏实现
public表示后面跟着的东西谁都能用。
而private关键词则表示,除非是类的创建者用这个类的方法进行访问,否则没人能访问到这个元素。private是竖在你与客户程序员之间的一堵墙。那些要访问private成员的人,会在编译的时候得到一个错误。
protected关键词很像private,它们的区别在于,继承类能够访问protected成员,但是不能访问private成员。
Java还有个“缺省”的访问权限,如果你没用上面三个的话,那就是指它了。通常把它成为package访问权限。因为同属这个package的类可以访问这个package中其它类的“缺省权限”的成员,但是出了这个package,它们就都是private的了。

复用实现
由于是用已有的类来合成新的类,因此这一概念被成为合成(composition,如果这个对象是动态的,通常把它成为聚合aggregation)。通常将合成称为“有(has-a)”关系,就像“轿车有引擎”。
合成具有极大的灵活性。

继承:复用接口
你有两种办法来区分新的派生出来的类和那个原来的基类。
1. 直接往派生类里加新的方法。
2. 也是更重要的区分方法是在新的类中修改基类方法的行为。这被称为覆写(override)那个方法。
“是”与“像”的关系
1. 结果是能用派生类的对象直接替换基类的对象。可以把这种情况想成完全替换(pure substitution),通常被称为替换原则(substitution principle)。从某种意义上讲,这是使用继承的理想方法。通常我们把基类同派生类的这种关系称作是(is-a)关系。
2. 基类还是可以被新的类所替代,但是这种替换是不完全的,因为的方法无法通过基类的接口访问。这可以被称为“像(is-like-a)”关系。

可凭借多态性相互替换的对象
非OOP的编译器的做法被称为前绑定(early binding)。在OOP中,不到运行的时候,程序没法确定代码的地址,所以向泛型对象发送一个消息的时候,就要用到一些特别的手段。为了解决这个问题,OOP语言是用了后绑定(late binding)的概念。
将派生类当作它的基类来用的过程称为上传(upcast)。
abstract基类和interface
abstract方法只能存在于abstract类里。如果有个类继承了abstract类,那么它要么实现这个方法,要么也是一个abstract类。abstract方法能让你将方法放到接口而不必为它写一些无意义的代码。
interface关键词更是对abstract类的概念的深化,它不允许你实现任何方法。interface是个很趁手也很常用的工具,因为它能彻底地将接口与实现分离开来。此外如果你愿意,还可以继承多个接口,因为要继承多个常规或是抽象类是不允许的。

对象的创建,使用和生命周期
1. 在写代码的时候决定将对象放到栈里(有时会被称为automatic或scoped的变量)或是静态的存储区域。(C++,速度快)
2. 在一个被称为堆的内存池里动态地创建对象。(Java,灵活性高)
(在栈中分配存储空间通常只需一个汇编指令,把栈指针向下移就行了,想把指针指回来也只要一条指令。而堆的存储分配则取决于存储机制的设计。)
Collection和迭代器
List类(以持有线性序列)
Map类(也称为关联性数组associative arrays,将一个对象同另一个对象关联起来)
Set类(不持有两个相同的对象)
单根继承体系
Java(实际上除了C++所有其它OOP语言)的回答是,是的,而这个最终的基类就叫Object.
下传与模板/泛型
沿着继承图向下传给一个更为具体的类型,这种方式称为下传(downcast)。
上传很安全,下传十有八九是不安全的。
参数化类型(parameterized type)是一种能够根据需要由编译器自动指派类型的类。(C++:template/Java:generics)
确保正确地清除
Java设计了一个垃圾回收器来处理释放内存的问题(仅此而已,不包括清除对象的其它方面)。
垃圾回收器的效率与灵活性
C++:编程复杂性较高
Java:效率和适用性较差

异常处理:与错误打交道
尽管在面向对象的语言中异常通常以对象的形式出现,但异常处理并不是一种面向对象的特性。异常处理在面向对象的语言问世之前就已经有了。

并发
Java能锁定任何对象的内存(毕竟这也是一种共享资源),这样同一时刻就只有一个线程能够访问这些内存。这是由synchronized关键词来做的。其它资源就得靠程序员自己来锁定了。通常可以创建一个表示这项资源的对象,然后让线程在访问资源之前先检查一下。

Persistence
轻量级的presistence既可以通过对象的序列化(object serialization),也可以通过数据对象(Java Data Object,简称JDO)来实现。

Java和Internat
Web是什么?
客户/服务器系统
把Web当作巨型的服务器
客户端编程
插件
脚本语言
Java
.NET和C#
安全性
Internet和Intranet
服务器端编程
应用程序

Java为什么能成功
系统能更易于表述和理解
最大程度上利用类库
错误处理
编写大项目
Java还是C++?

总结

「读书笔记」Thinking in Java 3rd Edition - 2: Everything is an Object