第一章 对象导论
1. Alan Kay总结面向对象语言:
1)万物皆为对象;
2)程序是对象的集合,他们通过发送消息来告知彼此所要做的;
3)每个对象都有自己的由其他对象所构成的存储(通过创建包含现有对象的包的方式来创建新型的对象);
4)每个对象都拥有其类型;
5)某一特定类型的所有对象都可以接受同样的消息。
2. Booch提出更简洁的描述:对象具有状态,行为和标识(就是每一个对象在内存中都有一个唯一的地址)。
3. 当在试图开发或理解一个程序设计时,最好的方法之一就是将对象想象为"服务提供者"。
4.程序开发人员角色分类:
1)类创建者(目标是构建类供别人使用--这种类只向客户端程序员暴露必须的部分,而隐藏其他部分,隐藏部分不能被任意修改,怕被不知情的客户端程序员损坏,从而减少bug;故诞生了类的内部设定边界:public(任何人都可用),private(除了类型创造者和类型内部方法之外的任何人都不可能访问),protected(和private相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员));
2)客户端程序员(收集各种类来快速应用开发);
5. 继承(is_a):如果我们能够以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类那就好多了,通过继承就可以达到这样的效果。不过也有例外(当源类,基类/超类/父类)发生变动,被修改的副本(子类)也会反映出变动。
6. 继承后:
1)直接在子类中添加新方法,这些方法并不是父类接口的一部分;
2)更重要的一种使子类和父类之间的差异方法改变现有的父类的方法的行为,这被称之为覆盖(overriding)。
7. 组合(has_a):现有的类合成新的类,所以这种概念被称为组合(composition),如果组合是动态发生的,那么它通常被称为聚合(aggregation)。例如:汽车拥有引擎。
8. 在java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态。
9. void doSomething(Shape shape){
shape.erase();
shape.draw();
}
Circle circle =new Circle();
doSomething(circle);
当Circle被传入到预期接受Shape的方法中,由于Circle可以被doSomething看作为Shape,也就是说doSomething()可以发送Shape的任何消息,Circle都可以接受。子类通过向上转型。
在java编译器在编译doSomething()的代码时,并不能确切知道doSomething()要处理的确切类型,所以通常会期望它的编译结果是调用父类Shape的erase()和draw()版本,而不是具体的Circle,Line相应的版本。正是因为多态才使得事情总是能够正确处理。
10.java是单根继承结构,使得所用对象都具有一个公用接口;单根继承也使得垃圾回收器得实现变得容易得多。
11. List(用于存储序列)
12. Map(称为关联数组,用来建立对象之间得关联)
13. Set(每种对象类型只有一个)
14. ArrayList(数组结构) 随机访问是一个花费固定时间得操作
LinkedList(链表结构) 随机选取元素在列表中移动,这种代价是高昂得,访问越靠近表尾得元素,花费时间越长
如果想在序列中间插入一个元素,LinkedList的开销比ArrayList要小。
15. java一开始就内置了异常处理,而且强制你必须使用它。如果没有编写正确的处理异常的代码,那么就会得到一条编译时的出错消息。这种有保障的一致性有时会使得错误处理非常容易。
16. 并发:如果有多个并行任务都要访问同一资源,所以出现了锁的机制。