引言
“He gave man speech, and speech created thought, Which is the measure of the Universe”
—Prometheus Unbound, Shelley
和其它自然语言一样,Java是表达思想的媒介。随着问题规模的越发增大、程度的越发复杂,凭借自身无与伦比的灵活性,Java得以更加轻松地解决实际问题。
记住,千万不要将Java仅仅视为各种特性的集合,这会使你失去对它的深入理解。设计思维是Java使用者十分重要的思考方式,也是Java的设计初衷:让使用者可以在Java上轻松地设计软件结构,而非只是用来进行简单的编程。毫无疑问,这不仅需要对语言的熟练运用,更需要对问题的透彻理解。
抽象
抽象是编写程序的基础,而问题的复杂程度取决于抽象的质量,良好的抽象结果有益于问题的解决。在这一点上,早期的组装式语言和命令式语言(FORTRAN, BASIC, C)做得不够优秀,因为我们不得不在解决问题的过程中考虑机器模型与问题模型的联系,因为在不同的机器上需要不同的编码实现,这无疑增加了编程以及维护的难度。
当然,替代方案总是有的,LISP和ASL使用模型化问题替代模型化机器,将问题转化为决策链。它们提供了另一种观察问题的视角(“所有问题都是列表”或“所有问题都是算法”),在解决特定类型的问题上的确效率颇高,但是一旦踏出那一亩三分地便会捉襟见肘。
面向对象编程(Object-Oriented Programming, OOP)是编程领域的重大改进,它摒弃了与问题毫无联系的机器部分,取而代之的是问题的抽象:对象(Object)。有了对象,我们得以从问题的角度解决问题,而不是从机器的角度解决问题。同样,程序也不再拘泥于只能解决特定领域的问题,而是可以解决更加通用的问题。但是这不代表OOP与计算机毫无关联。我们可以将每个对象都视为一台计算机,它们有状态、动作,你可以发送指令操作它们。
面向对象编程具有五个特征:
1.万物皆对象
2.程序本质上是许多对象互相通信的过程
3.任何对象都是其它对象的组合
4.任何对象都有类型
5.同一类型的对象接收同样的信息
简单地说,对象拥有状态、行为、身份。状态来自于内部的数据,行为由方法产生,身份(多数情况下可以认为是内存地址)用来将每个对象区分开。
接口
我们所说的“类”最早来源于亚里士多德对物种种类(type)的研究,在其中他首次使用“鱼类”和“鸟类”的称呼。类中包含具有相同特征与行为的对象,对象可以属于不同的类。编程语言中的关键字class便代表了类(尽管实际上我们创建的是新的数据种类(type),但所有OOP语言都使用class而不是type作为关键字)。在程序运行期间,除了各自的状态,类中成员彼此完全相同。可以说,将实体抽象成类是面向对象编程最基本的步骤。
类被创建后,我们便可以创建并操作对象,但是问题也随之而来:如何在问题和对象之间建立一对一的联系?怎样让对象做出恰当的行为?显然,对象只会对特定的请求做出回应,我们称这样的请求为接口(interface),而决定接口的则是种类(type)。接口里面需要有具体代码,这些代码加上对象中的隐藏数据统称为实现(implementation)。下面用电灯泡作为一个例子:
如图所示,类名是Light,对象是lt,其中包含的方法可以让它打开、关闭、变亮、变暗。通过使用关键字new,我们得以创建对象,注意这里创建的是指向对象的引用,引用的名字是lt。对象的方法通过在对象名后添加逗点(.)来操作,这与面向过程编程的语法类似。
上图中间包含类名和方法名的方块称为统一建模语言(Unified Modeling Language, UML)。在最上面方块内的是类名,中间方块内的是数据成员名,最下面方块内的是方法名。通常情况下,只有类名和public方法表示在UML中。当然如果仅仅需要类名,方法名部分也可以省略。
网友评论