文章导读
【当前软件开发领域有两大编程思想,一个是面向过程的编程思想,一个是面向对象的编程思想。依据编程思想的不同,编程语言也分为面向过程的语言和面向对象的语言。本文探讨事物抽象和Java对象的关系以及如何封装Java对象。通过本文的学习,你将掌握如何将现实事物抽象为Java对象并进行封装。】
本文分成三个小节讲述事物的抽象与Java对象。第一小节从五子棋程序中理解什么是面向对象的编程思想;第二小节给出一个水果类案例,从水果类案例中理解如何从现实世界抽象出Java对象;第三小节介绍如何封装一个Java对象。
第一小节 面向对象的编程思想
面向过程的编程思想在考虑问题时,是以一个具体的流程为单位,考虑程序的实现方法,关心的是功能的实现。分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
例如设计一个五子棋程序,面向过程的设计思路是首先分析问题的步骤:
1、开始游戏;
2、黑子先走;
3、绘制画面;
4、判断输赢;
5、轮到白子;
6、绘制画面;
7、判断输赢;
8、返回步骤2;
9、输出最后结果。
把上面每个步骤分别用函数来实现,问题就解决了。面向过程的设计思想,每一个环节只关注行为动作和功能实现,没有考虑数据的状态,而且各个行为之间的耦合性比较强,不利于程序的扩展和模块化。
面向对象的编程思想在考虑问题时,以具体的事物(对象)为单位,考虑它的属性(特性)及动作(行为),关注整体,就好比观察一个人一样,不仅要关注他怎样说话,怎样走路,还要关注他的身高、体重、长相等属性特征。
同样是设计五子棋程序,面向对象的设计则是以事物(对象)的思路来解决问题。
整个五子棋可以分为:
1、玩家对象,这两方的行为是一模一样的;
2、棋盘对象,负责绘制画面;
3、控制对象,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(控制对象)来对棋局进行判定。
图1 对象交互图
面向对象的编程思想更加接近于现实的事物,从现实中抽象出的(事物)对象自身是内聚的,对象有自身的数据(属性)和操作(行为),因此面向对象可以更好地实现开闭原则,即程序对外扩展是开放的,对内修改是关闭的,当程序的需求改变时,可以对模块进行扩展,使其具有满足那些改变的新行为,而无需改动原有的代码。
总的说来,面向对象的设计思想有如下特点:
(1)可扩展:新特性能够很容易的添加到现有系统中,不会影响原有的代码。
(2)可修改:当修改某一部分的代码时,不会影响到其它不相关的部分。
(3)可替代:将系统中某部分的代码用其它有相同接口的类替换时,不会影响到现有系统。
第二小节 抽象与对象
面向对象编程思想的一个基本方法就是抽象。抽象是从众多的同类事物中抽取出具有共同特征的过程及方法。
例如:苹果、香蕉、葡萄等都属于水果类别,假如我们要给水果找出共同特点,就需要抽取(抽象)苹果、香蕉、葡萄的共同特征,舍弃其不同的特征。一般说来苹果、香蕉、葡萄具有汁液多、糖分多、并且还含有挥发性芳香物质、可以生食等特点。具备上述特点的一般都可以归类为水果。

图 2 水果的共同特征
抽象就是对同类事物的概括和归纳,前面例子的苹果、香蕉、葡萄是现实中的事物,人们在品尝的同时,抽取它们共有的特点,并起了一个新名称水果,来概括和归纳具有苹果、香蕉、葡萄共同特点的所有事物。例如:生梨、桃子也具备苹果、香蕉、葡萄的共同特点,因此生梨和桃子也可以归类为水果。
如果以面向对象的编程思想来看前面例子的话,水果可以称之为类,而苹果、香蕉、葡萄可以称之为类的实例或对象。类是抽象出来的事物,现实生活中并不存在,例如水果,水果是人们赋予具有苹果、香蕉、葡萄等共同特点的名称,不单指某一事物;对象是指具体的实物或概念,例如苹果、香蕉、葡萄等对象是实物,而一项政策可能就是一个概念性的对象了,在现实生活中,万事万物皆对象,面向对象编程就是模拟现实生活中的一个个对象来编程的。
现在生活中的许多对象都要进行分类,例如:人类、水果类、动物类、汽车类等。
分类的作用主要是为了便于管理和维护。面向对象的编程思想主要是通过模拟现实世界的各个对象来编程的,那么这些现实世界中的对象是怎样模拟或映射到计算机中的呢?这就要归功与面向对象编程思想的基本方法——抽象。
抽象并不是Java语言中所特有的概念,在其它面向对象的语言中,如C++在构建对象时也需要抽象建模。例如:在学生信息管理系统中,需要将学生的共同特征抽取出来,如学号、学分、性别等特征,构建学生模型。提炼学生共同特征的过程就是抽象建模。通过抽象,可以很容易地归纳出事物的共同特征和行为,以便与其它对象区别开来,这样抽取出来的特征和行为在面向对象的编程中叫做属性和方法。
属性是指对象具有的各种特征,学号、 学分、性别等特征就是学生对象的属性;行为一般用动词描述对象的各种操作。
每个对象的属性都有特定值,根据图3可知,学生甲乙和学生丙丁的学号、学分、性别都不一样。

图3 甲乙和丙丁学生的属性
第三小节 封装Java对象
前面一节内容讲到了抽象与对象,抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象。例如:把具有汁液多、糖分多、含有挥发性芳香物质、可以生食等特征的事物归纳为水果类,苹果、葡萄、生梨则为水果类的具体示例对象。
在面向对象编程思想中,不仅把汁液多、糖分多、含有挥发性芳香物质、可以生食等的共同特征放到水果类里,同时也把水果的开花、落果、膨大、成熟等共同行为放到水果类里,这样水果类既包含了水果所具备的共同特征,也包含了开花、落果、膨大、成熟等共同行为。
当外部需要访问水果类时,调用水果类对外提供的访问方法来访问其共同特征和行为。例如:水果类提供了get方法来访问其属性(特征),提供了开花、落果、膨大、成熟等方法来访问其行为。同时通过Java关键字public、protected、private设置水果类的访问权限。
由上面的内容可以看出,Java封装就是把现实世界同类事物的共同特征和行为抽取出来,放到一个新建的类中,并设置类属性(特征)和行为的访问权限,同时提供外部访问类属性和行为的方法。
把事物的属性和行为封装在一起,可以对外隐藏内部数据,控制用户对内部数据的修改和访问,封装也消除了面向过程编程中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性。
下面以水果类为案例,具体说明封装的过程和优点。
启动eclipse,建立Fruits项目。在Fruits项目src目录下新建包com.milihua.fruits,如下图所示:

图4 新建水果类项目
在com.milihua.fruits包下新建FruitManager类,FruitManager类为水果管理类,负责水果品种的增加、删除,以及水果的展示等功能。在新建类时要注意勾选public static void main(String[] args)选项,如下图所示:

图5 新建FruitManager类
在com.milihua.fruits包下新建类Fruits类,Fruits类为水果类,负责水果的创建和展示。水果类封装代码如下:
package com.milihua.fruits;
public class Fruits {
//汁液含量
private String water;
//糖分含量
private String sugar;
//芳香度
private String fragrance;
Fruits(String inwater,String sugar,String fragrance)
{
this.water = inwater;
this.sugar = sugar;
this.fragrance = fragrance;
}
/**
* Function showFruit
* Description: 输出水果的水分含量、糖分含量、芳香度
* input: 无输入参数
* return: 无返回
*/
public void showFruit()
{
System.out.println("水分含量:" + getWater());
System.out.println("糖分含量:" + getSugar());
System.out.println("芳香度:" + getFragrance());
}
public String getWater() {
return water;
}
public void setWater(String water) {
this.water = water;
}
public String getSugar() {
return sugar;
}
public void setSugar(String sugar) {
this.sugar = sugar;
}
public String getFragrance() {
return fragrance;
}
public void setFragrance(String fragrance) {
this.fragrance = fragrance;
}
}Fruits类的属性声明为私有的(private),方法声明为公共的(public)。这样,对象能够直接调用类中定义的所有方法,当对象要修改或得到自己属性的时候,就必须要调用已定义好的专用的方法才能实现。起到了隐藏内部数据,控制用户对内部数据修改和访问的作用。类的可复用性和可扩展性会在继承或多态一节讲到。
对于面向对象编程而言,需要掌握如下几点:
(1)抽象是把同类事物的共同特征抽取出来归纳为类,类的具体实例为对象。
(2)封装就是把抽取的事物属性和行为打包到一个类中,并隐藏内部数据和方法的实现过程。
(3)编程时要遵循对象调用方法,方法修改属性。
文章小结
1、面向对象的编程思想是目前应用最广泛的编程思想,使用面向对象的编程思想适用于规模较大的应用程序。Java面向对象的编程思想引入了许多概念和机制,归纳总结为抽象、封装、继承和多态。采用面向对象的编程思想并不是全部弃用面向过程的编程思想,相对而言,面向过程的编程思想面向对象编程的基础,面向对象编程的程序里面一定有面向过程的程序片段。在程序中,面向过程的编程思想,通过方法来实现,面向对象的编程思想通过对象来封装方法和数据。
2、事物抽象的过程也是一个裁剪的过程,事物不同的、非本质性的特征被裁剪掉,留下共同特征。但共同特征也是相对的,例如,对于汽车和大米,从买卖的角度看都是商品,都有价格,是他们的共同的特征,但从其应用方面来看是不同的。所以在抽象时,同与不同,决定于从什么角度上来抽象,抽象的角度取决于分析问题的目的。
3、从现实世界中封装一个类,就是根据具体的应用从同类型事物中抽取出共同的属性和方法。例如:封装水果类,将苹果、葡萄、生梨等事物的共同特征抽取出来,即汁液含量、糖份含量、芳香度等,只要是具有这些特征的,一般都归为水果类。
思考与练习
1、面向过程的编程思想和面向对象的编程思想有什么区别?
2、家中都有电视机、冰箱、洗衣机等家用电器,请抽象出电视机、冰箱、洗衣机的共同特征,作为家用电器类的属性。
3、封装一个家用电器类。