所有编程语言都提供抽象机制。可以认为,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指抽象的是什么?汇编语言是对底层机器的轻微抽象。接着出现了许多所谓“命令式”语言(如Foratran、basic,C等)都是对汇编语言的抽象。这些语言在汇编语言基础上有了大幅的改进,但是它们所作的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决的问题的结构来了考虑(考虑问题是面向机器的,而不是面向具体的问题的)。程序员必须建立起在机器模型(位于“解空间”内,这是你对问题建模的地方,例如计算机)和实际待解问题的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联。建立这种映射是费力的,而且这不属于编程语言所固有的功能,这使得程序难以编写,而且维护代价高昂,同时也产生了作为副产物的整个“编程方法”行业。

另一种对机器建模的方式就是只针对待解问题建模。早期的编程语言,如lisp和apl,都选择考虑世界的某些特定视图(分别对应于“所有问题最终都是列表”或者“所有问题都是算法形式”)。prolog则将所有问题都转换成决策链。此外还产生了基于约束条件编程的语言和专门通过对于图形符号操作来实现编程的语言。这些方式对于它们所要解决的特定类型的问题都是不错的解决方案,但是一旦超出其特定领域,它们就力不从心了。

面向对象方式通过向程序提供表示问题空间中的元素的工具而更进了一步。这种表示方式非常通用,使得程序员不会受限于任何特定类型的问题。我们将问题空间中的元素及其在解空间中的表示称为“对象”。这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定的问题。因此,当你在阅读描述解决方案的代码的同时,也是在阅读问题的表述。相比以前我们所适用的语言,这是一种更灵活和更强有力的语言抽象。所以,OOP允许根据问题来描述问题,而不是根据运行解决方案的计算机来描述问题。但是它仍然与计算机有联系:每个对象看起来都有点像一台微型计算机--它具有状态,还具有操作,用户可以要求对象执行这些操作。如果要对现实世界中的对象作类比,那么说它们都具有特性和行为似乎不错。

1).外物皆为对象

2).程序是对象的集合,它们通过发送消息来告知彼此要做的。要想请求一个对象,就必对该对象发送一条消息。更具体地说,可以把消息想象成对某个特定对象的方法的调用请求。

3).每个对象都有自己的由其他对象所构成的存储

4).每个对象都拥有其类型

5).某一特定类型的所有对象都可以接收同样的消息

 

 

参考资料:《Java编程思想第四版》,《深入Java虚拟机》