6.1 类和对象概述

  面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。早期的计算机编程是面向过程的,解决的都是一些相对简单的问题。随着IT行业不断发展,计算机被用于解决越来越复杂的问题。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成关联、继承、实现、依赖等关系,从而帮助人们实现对现实世界的抽象与建模。通过面向对象的方法,更利于用人容易理解的方式,对复杂系统进行分析、设计与开发。同时,面向对象也能有效提高编程的效率,通过封装技术和消息机制可以像搭积木一样快速开发出一个全新的系统。

6.1.1 面向过程与面向对象

  什么是面向过程?面向过程与面向对象的区别是什么?通过下面这个广泛使用的案例的介绍,比较容易理解面向过程和面向对象的区别。

  例如,要编写一个五子棋的游戏,用面向过程的设计思路,其分析步骤如下。

  (1)开始游戏,绘制基本画面。

  (2)黑棋先走,绘制走完画面。

  (3)判断黑棋是否赢棋。

  (4)白棋走棋,绘制走完画面。

  (5)判断白棋是否赢棋。

  (6)返回步骤(2),继续执行。

  (7)输出五子棋输赢结果。

  通过之前学过的流程控制和Java API方法,这个问题可以采用面向过程的方法解决。而面向对象则完全采用了另外一套设计思路,整个五子棋系统可以分为以下3个部分。

  (1)棋盘部分:负责绘制基本画面以及黑棋、白棋走完后的画面。

  (2)黑棋、白棋:除了颜色不一样外,其行为是一样的。

  (3)规则部分:负责判定输赢和犯规。

  有了这3个部分,整个五子棋系统运作方式如下。

  (1)首先棋盘部分先绘制基本画面。

  (2)然后黑棋、白棋部分接受用户输入,执行黑棋、白棋部分的行为,并告知棋盘部分。

  (3)棋盘部分接收黑棋、白棋部分的行为,绘制黑棋、白棋走完后的画面。

  (4)棋盘部分发生变化后,规则部分对棋局进行判定。

  可以明显地看出,面向对象是根据各个部分(对象)来划分系统,而不是根据步骤,每个对象拥有自己的属性(例如棋的颜色)和行为(例如绘制画面)。编写程序就是调用不同对象来执行相应的行为,影响其他对象的属性或调用其他对象的行为,最终完成程序的功能。

  采用面向对象有这样的好处,例如同样是绘制棋盘画面,这样的行为在面向过程的设计中分散在了很多步骤中,很可能出现不同的绘制棋盘画面的代码版本。而面向对象的设计中,绘制棋盘画面只可能在棋盘部分出现,从而保证了绘制棋盘画面代码的统一。

  功能上的统一保证了面向对象程序设计的可扩展性。例如程序员要加入悔棋的功能,如果采用的是面向过程的设计,需要改面向过程代码中所有行棋、棋盘画面绘制部分。如果是面向对象,只用改动棋盘部分就行了,棋盘部分保存了黑棋、白棋双方的棋谱,简单回溯就可以了,不用调整其他部分,同时整个调用的对象功能顺序都没有变化,改动只是局部的。

6.1.2 类和对象的概念

  Java是一种面向对象的语言,因此Java开发人员要学会用面向对象的思想考虑问题和编写程序。从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式,这是面向对象设计思想的核心。面向对象更加强调运用人类在日常的思维逻辑中经常采用的思想方法与原则,如封装、抽象、继承和多态等。

  什么是对象呢?现实世界中,万物皆对象,例如“蓝桥系统”中Java工程师是对象,一辆汽车、一间房子、一张支票、一个桌子也是对象,甚至一项计划、一个思想都是对象。

  下面以现实生活中的两个对象为例简要介绍一下对象。例如讲授Java基础课的蒋老师是一个对象,蒋老师具有的属性包括姓名、性别、年龄、学历等,具有的行为包括讲课、批改作业等。蒋老师开的小轿车也是一个对象,小轿车这个对象具有的属性包括品牌、颜色、价格等,具有的行为包括行驶、停止、喇叭响等。

  在Java面向对象编程中,将这些对象的属性仍然称为属性,将对象具有的行为称为方法。例如,老师具有姓名、性别、年龄、学历这些属性,小轿车具有品牌、颜色、价格等属性,这些属性具体的值称为属性值。老师具有讲课、批改作业等行为,小轿车具有行驶、停止、喇叭响等行为,这些行为称为方法。

  什么是类?类是对具有相同属性和相同行为的对象的抽象。例如,班级中有学生王云、刘静涛、南天华、雷静,他们4个都是现实世界的学生对象,而学生这个角色是我们大脑中的抽象概念,是对这些类似对象进行的抽象。在计算机世界里,学生就是类。通过学生这个类,可以创建出一个一个的对象,通常也称为实例化出一个一个对象,如图6.1所示。

  通过对王云、刘静涛、南天华、雷静这些现实世界学生对象的抽象,可以分析出学生这个类具有的属性包括姓名、年龄、性别、年级等,方法包括听课、写作业等,如图6.2所示。

6.1 类和对象概述 - 图1
图6.1 对象和类的关系

6.1 类和对象概述 - 图2
图6.2 学生类