每次读Thinking in java都会有新感悟和进步,此次便决定将一些精华部分摘录成笔记,便于以后快速回复这本java界的名著;
《Thinking in Java 4th Edition》
- 命令式语言(如FORTRAN、BASIC、C语言)本质上都是对汇编语言的抽象;
- 对于非OOP语言,程序员要担负起“解空间”和“问题空间”建立关联的责任,通常这种映射是非常费力的;
- Alan Kay曾经总结了第一个成功的面向对象语言Smalltalk的五个基本特征:
- 万物皆为对象;
- 程序是对象的集合;
- 每个对象都有自己的由其他对象所构成的存储;
- 每个对象有拥有其类型;
- 某一特定类型的所有对象都可以接收同样的消息;
- 设计类其实就是设计新的数据类型,其运行方式与内置的(built-in)类型几乎完全一致;
- 面向对象程序设计的挑战之一,就是在问题空间的元素和解空间的对象之间创建一对一的映射;
- 我们可以将现有类的对象放在某个新的类中,称之为“创建一个成员对象”,新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成,这种概念称为组合(composition),如果组合是动态发生的,那么它通常被称为聚合(aggregation)。
- 组合是has-a关系,继承是is-a或者is-like-a的关系;所以在设计新类时,我们应该首先考虑清楚新类和旧类到底是什么关系;如果两种设计方式都可以实现或者关系特别难以划分的时候,应该首先考虑组合,因为它更加简单灵活;
- 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛,“一个圆形也就是一个几何形“;
- 对于继承可能会引发某种争论: 继承应该只覆盖基类的方法(而并不添加在基类中没有的新方法)吗?is-a的关系就是子类中没有添加任何新方法,仅仅是覆盖了基类的某些方法,这是纯粹替代,某种意义上,这是一种处理继承的理想方式;有时必须在导出类中添加新的接口元素,这样也就扩展了接口,这就是is-like-a的关系;
- 类由属性和方法组成,调用某个方法的行为可以看做外界向该类的对象发送了消息通知;
- java是默认后期绑定的,先说前期绑定,前期绑定的意思就是说在编译的时候所有方法调用都已经由编译器映射好了具体的代码执行地址,通常非OOP编程的编译器都是这样处理的;相对而言,后期绑定就是编译器只是确保被调用方法的存在,而并没有将所有方法调用映射到具体的代码执行;说白了就是某些时候问使用接口或者泛型发送消息(执行方法调用)时,编译器当然不知道该接口或者泛型具体应该是对应哪个具体类;而只有在执行期间,我们将具体对象作为参数传进来之后才最终确定执行代码的地址;
- 单根集成,所有对象都继承于终极基类Object;
- java SE5之前,容器是只能存储Object类型的;
- 动态创建对象有这样一个一般性的逻辑假设:对象趋向于变得复杂,所以查找和释放存储空间的开销不会对对象的创建造成重大冲击。
- 异常是一种对象,它从出错的地点被”抛出“,并被专门设计用来处理特定类型错误的相应的异常处理器”捕获“。异常处理就像是与程序正常执行路径并行的、在错误发生时执行的另一条路径。因为它是另一条完全分离的执行路径,所以不会干扰正常的执行代码;