本章讨论Java的面向对象的特征。Java是一种纯粹的面向对象的程序设计语言,它通过类和对象等概念来组织和构建整个程序。一个Java程序乃至Java程序内的一切都是对象。因此,用Java进行程序设计,必须将自己的思想转入到一个面向对象的世界,以对象世界的思维方式来思考问题。类是Java的核心和本质,在某种程度上,编写一个Java程序就是在定义类和创建对象,也就是说定义类和创建对象是Java编程的主要任务。
本章主要内容
& 面向对象概念
& 对象的创建、使用和撤销
& 类的定义、成员变量和方法
& 类的组织
编程思想有面向对象和面向过程之分。面向过程的程序设计方法是从解决问题的每一个步骤入手,它适合于解决比较小的简单问题。例如,C语言采用面向过程的程序设计模型,但是由于C本身几乎没有支持代码重用的语言结构,并且缺乏统一的接口,当程序的规模达到一定程度时,程序员很难控制其复杂性;面向对象的程序设计方法则按照现实世界的特点来管理复杂的事物,将事物抽象为对象,并具有自己的状态和行为,通过对消息的反应来完成一定的任务。
面向对象编程(Object-Oriented Programming,OOP)是一种创建计算机程序的方法,其过程类似于物理世界中物质对象是如何组织结合在一起的。通过使用这种开发风格,能够创建更加可靠、更加容易理解并且具有可复用性的程序。
Java是通过如下几个方面实现面向对象编程的原理的:
· 将程序组织成叫做“类”的元素,并且用这些类创建对象。
· 从类结构的两个方面来定义它:它应该如何运作和它的属性是什么。
· 用一个类从另一个类里继承功能的办法将类与类彼此联系起来。
· 通过包或者接口将类链接在一起。
在面向对象程序设计思想中,类(Class)和对象(Object)是非常重要的概念。类是从日常生活中抽象出来的具有共同性质的实体,而对象是类的实例。
一个对象就是变量和相关的方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为。例如可以把一辆自行车看作一个对象,这个对象的变量包括它的重量、速度、位置等,它的方法包括变档、刹车等。对象的变量也称为域或者属性。
对象之间必须通过交互来实现复杂的行为。例如,要使自行车变档,必须发给它一个消息,告诉它进行何种动作(变档)以及实现这种动作所需的参数(需要达到几档)。
由于任何一个对象的所有行为都可以用方法来描述,因此通过消息机制就可以完全实现对象之间的交互,同时,处于不同处理过程甚至不同主机的对象之间也可以通过消息实现交互。
上面所说的对象是一个具体的事物,如每辆自行车都是一个不同的对象,但是多个对象常常具有一些共性,如所有的自行车都有轮子、刹车装置等,于是抽象出一类对象的共性,这就是类。类中定义一类对象共有的变量和方法,把一个类实例化即生成该类的一个对象,例如我们可以定义一个自行车类来描述所有自行车的共性。通过类的定义可以实现代码的复用。我们不用去描述每一个对象(如某辆自行车),而是通过创建类(如自行车类)的一个实例来创建该类的一个对象,这就大大简化了软件的设计。
Java是面向对象的程序设计语言,从面向对象这个角度看,它体现了如下3个特点。
面向对象的程序设计语言都是把数据和处理数据的操作结合在一起而构成一个整体,这就是对象。对象的使用者只能看到对象的外部特性,比如其主要功能、如何调用等,而看不到其内部如何实现这些功能。作为面向对象的程序设计语言,程序中的数据就是变量,程序对数据的操作处理则称为方法。变量和方法都被封装在对象中。所以,一个对象就是变量和方法的集合,其中变量表明这个对象的状态,方法实现这个对象所具有的行为。而且在程序中将这些变量和方法进行封装,使它们成为一个模块,再用一个名字来代表这个模块。这样,在以后更高层的程序设计中,就不必关心某个对象的行为到底是怎样实现的。可见,将对象封装就是为了使模块尽可能少地展现其内部细节,而只是以一种界面来面向外部。对象的封装性减少了程序各部分之间的依赖,使程序的复杂性降低且可靠性提高,更便于修改。
在面向对象的程序设计中,对象是从类创建出来的。在Java中,许多类组成层次化结构。一个类的上一层称为其父类,而下一层称为其子类。一个类可以继承其父类的变量和方法,而且这种继承具有传递性。就是说,一个类可以继承其上一层和其再上一层的变量和方法。这种可传递的继承性使得下层多个相似的对象可以共享上层类的数据和程序代码,而子类又可以在继承父类的基础上增添新的内容和功能。这种代码共享和代码可增添的继承特性,使Java既灵活方便又提高效率。
多个对象往往涉及多个行为。体现在程序设计中,即一个对象往往包含多个方法,每一个方法对应一个行为。所以,一个对象完成某个动作也就是程序执行相应的方法。于是,对象之间通过交互来实现复杂的行为,这就叫对象之间的通信。利用通信可以实现一个对象和另一个对象的信息传递。信息传递涉及3个要素:一是信息接收对象;二是接收对象用哪个方法完成指定的动作;三是此方法需要的参数。由于信息传递的要素非常清晰,所以用在编程中也很方便。这种通信相关性使许多复杂功能得以实现,又能避免编程的错综复杂。