Java的核心是面向对象程序设计(Object-Oriented Programming, OOP).面向对象方法论与Java是密不可分的,而Java所有的程序至少在某种程度上都是面向对象的.因为OOP对Java的重要性,所有在开始编写一个那怕是很简单的Java程序之前,理解OOP的基本原理都是非常有用的.
OOP是一种功能强大的程序设计方法.从计算机诞生以来,为适应程序不断增加的复杂度,程序的设计方法论也发生论巨大的变化.例如,在计算机最初被发明时,程序设计是通过使用计算机面板输入二进制机器指令来完成的.只要程序仅限于几百条指令,这种方法是可以接受的.随着程序的增长,汇编语言被发明了,这样程序员就可以使用代表机器指令的符号表示法来处理大型,复杂的程序.随着程序的继续增长,高级语言的引入为程序员提供了更多的工具,这些工具可使他们处理更复杂的程序.当然,第一个广泛使用的语言FORTRAN.尽管FORTRAN是人们迈出的颇具影响力的第一步,但是他很难设计出清晰,简洁且易懂的程序.
20世纪60年代诞生了结构化程序设计方法,C和Pascal这样的语言鼓励使用这种方法.结构化语言的使用使得编写中等复杂程度的程序变得相当轻松.结构化语言的特点是支持孤立的子例程,局部变量,丰富的控制结构和不使用GOTO语句.尽管结构化语言使一个功能强大的工具吗,但是在项目很大时仍然显得捉襟见肘.
考虑一下:程序设计发展的每个里程碑,技术和工具都是为了使程序员处理日渐复杂的程序而创建的.在这条道路上的每一步,新的方法都吸收了过去方法的精华而不断改进.OOP出现之前,许多项目已经接近(超过)结构化方法工作的极限.于是,为了冲破这一束缚,就创建了面向对象方法.
面向对象程序设计采纳了结构化程序设计的思想精华,并且用一些新的概念与之结合.这样的结果就是一种新的程序组织方法的产生.广义上讲,一个程序可以用下面的两种方法来组织:一种是围绕代码(发生了什么),一种是围绕数据(谁受了影响).如果仅适用结构化程序设计技术,那么程序通常围绕代码来组织.这种方法可以被认为是”代码作用于数据”.
面向对象程序则以另一种方式工作,他们以”数据控制访问代码”为主要原则,围绕数据来组织程序.在面向对象语言中,需要定义数据和作用于数据的例程.这样,数据类型可以精确的定义出哪种类型的操作可以应用于该数据.
为了支持面向对象程序设计的原理,所有的OOP语言,包括Java在内,都由三个特性:封装(encapsulation),多态性(polymorphism)和继承(inheritance):
1.封装
封装是一种讲代码与他所处理的数据结合起来,而不被外界干扰的程序设计机制.在面向对象语言中,代码和数据可以使用创建自包含的黑盒(black box)的方式捆绑在一起.盒子中包含了所有必须的数据和代码.当代码和数据以这种方式链接在一起时,就创建了对象.换言之,对象是支持封装的.
在对象中,代码或数据,或者两者对该对象都可以是私有的(private)或公有的(public).私有代码或数据仅被对象的其他部分知晓或访问,即私有代码或数据不能被该对象以外的任何程序部分所访问.当代码或数据是公有的时,虽然他们是定义在对象中的,但程序的其他部分也可以对其进行访问.通常,对象的公有部分用于为对象的私有元素提供控制接口.
Java的基本封装单元是类(class).虽然本书后面将会详尽的介绍类,但是下面对类的简述也会对你有所帮助.类定义类对象的形式,指定了数据和操作数据的代码.Java使用类规范来构造对象.对象时类的实例.因此,类在本质上是指定如何构建对象的一系列规定.
组成类的代码或数据称为类的成员(member),具体而言,类定义的数据称为成员变量(member variable)或实例变量(instance variable).处理这些数据的代码则称为成员方法(member method)或简称为方法(method).方法是子例程在Java中的术语.如果熟悉C/C++,那么知道Java程序员所称的方法就是C/C++程序员所称的函数,会有所帮助.
2.多态性
多态性(polymorphism)是一种允许使用一个接口来访问一类动作的特性.特定的动作由不同情况的具体本质而定.汽车的方向盘就是一个简单的多态性示例.无论实际的方向控制机制是什么类型的,方向盘(也就是接口)都是一样的.也就是说,无论汽车是手动操纵,电力操纵还是齿轮操纵,方向盘使用起来都是一样的.因此,只要知道如何操作方向盘,就可以驾驶任何类型的汽车.
同样的原理也可以应用于程序设计.考虑一下堆栈(先进后出),你的程序可能需要三个不同的堆栈:一个用于处理整形值,另一个用于处理浮点型值,还有一个处理字符.在这个示例中,尽管堆栈存储的数据类型是不同的,但是实现各个堆栈的算法都是一致的.在非面向对象的语言中,需要创建三个不同的堆栈例程,每个例程使用不同的名称.然而,在Java中,由于多态性的使用,可以创建一个基本的堆栈例程来为这三种特定情况服务,这样,只要知道如何使用一个堆栈,就能够使用所有堆栈.
更普遍的是,多态性的概念常常被表述为”单接口,多方法”,这就意味着为一组相关的活动设计一个泛型接口是可能的.多态性通过允许同一接口指定一类动作减少了程序的复杂度.编译器的工作就是选择适用于各个情况的特定动作(也就是方法).而程序员则无须手动进行这样的选择.你要做的仅仅是记住,以及利用这个统一的接口.
3.继承
继承是一个对象获得另一个对象的属性的过程.继承之所以重要,是因为他支持层次结构类的概念.思考一下就会发现,许多知识都是通过层次结构(即从上至下)方式进行管理的.例如,红色美味的苹果是苹果的一部分,而苹果又是水果的一部分,水果类则是食物类的一个部分.即食物类具有的某些特性(如食用,营养)也适用于他的子类–水果.除了这些特性以外,水果类还具有与其他事物不同的特性.苹果类则定义了属于苹果的特性.而红色美味的苹果继承了前面所有的类的属性,还会定义自己特有的属性.
如果没有使用层次结构,那么对象就不得不明确定义出自己的所有特性.如果使用继承,那么对象就只用定义使自己在类中与众不同的属性就可以了,至于基本的属性,可以从自己的父类继承.因此,正是继承机制使得对象能够成为更为一般的类的特定实例.