名师讲坛:Java开发实战经典(第2版)
上QQ阅读APP看书,第一时间看更新

5.15 实例讲解

面向对象的基础知识主要以单类的定义操作为主,为了帮助读者更好地理解讲解过的概念,下面将通过几个具体的实例进行结构以及引用的讲解。

5.15.1 系统登录

在各个应用系统中,读者都应该可以看见用户登录程序的影子,下面本书就模拟一个简单的用户登录程序,为方便读者的理解,本书使用初始化参数的方式输入用户名和密码。在本程序中假设用户名为lixinghua,密码为mldn。

1.程序分析

既然使用初始化参数的方式输入用户名和密码,所以在程序运行之前首先就必须判断输入的参数个数是否合法,如果不合法,则必须提示用户的程序执行错误,并退出程序,如果用户已经正确地输入了参数,则就可以进行用户名及密码的验证了。如果信息正确则显示“欢迎× ××光临!”,否则显示“错误的用户名及密码”。

2.程序基本功能实现

【例5.74】基本功能实现

程序运行结果(在命令行中输入参数)

(1)没有输入参数

(2)输入的用户名及密码错误

(3)输入正确的用户名及密码

上面的程序已经完成了一个最基本的功能,但是读者现在思考,本道程序之中存在哪些问题呢?以上的程序并不是一个很好的程序,程序在主方法中编写了大量的代码,而主方法就好比是一个客户端,现在要求客户端自己比较、自己输出,那么这显然不合理,最简单的做法就是,客户端只要得到最终的结果集合,至于中间是如何判断的,它根本就没有必要去关心,就好比进楼门要刷卡一样,用户只需要返回刷卡成功或刷卡失败的信息即可,而并不关心里面是如何去运算的。所以最好的做法是单独做一些类并使用这些类封装具体的判断过程。

3.程序优化

【例5.75】将信息的判断过程形成若干类

程序的运行结果与之前相似。从上面的程序中可以发现以下几点:

(1)主方法处代码较少,因为是客户端,所以要方便客户使用。

(2)Check类的主要功能就是验证操作,只需要传入用户名和密码就可以完成验证。

(3)Operate类的主要功能就是封装Check类的操作,并把Check的信息返回给调用处。

上面程序的调用关系如图5-23所示。

图5-23 登录验证程序时序图

说明

提问:我怎么去开发一个程序?

该如何去开发一个程序?很多的知识都已经掌握了,可是拿到一个题目之后还是无从下手?

回答:基础扎实、循环分析。

首先,这是很多初学者都会遇到的问题,因为代码的开发是一个基础熟练过程的积累,所有的基础知识运用得越熟练,代码的开发速度越快,代码开发多了,思路也就有了,而且拿到一个问题之后,如果觉得分析类有困难,可以先暂时不分析,先把基本的功能做完,做完之后对一些输入的数据进行验证,慢慢地再把主方法中的代码尽可能减少,之后再去考虑代码的可重用性,几次下来之后感觉就会好一些了。

还有必须提醒读者的是,类的开发是一个渐进的过程,当发现代码中重复的进行复制—粘贴的时候,就可以考虑将之形成一个类进行调用。

5.15.2 单向链表实现(1)

链表是在数据结构中经常见到的一种形式,实际上在Java中也可以通过引用传递的方式进行实现,本节为读者简单介绍一下Java中实现链表的基本形式。

在讲解链表之前,首先为读者简单介绍一下链表的基本概念。所谓的链表就好像火车车厢那样,从火车头开始,每一节车厢之后都连着后一节车厢,如图5-24所示。

从图5-24中清楚发现,每一节车厢就相当于是一个节点,每一个节点,除了要保存自己的内容之外,还要保存下一个节点的引用,那么这样的节点该如何通过程序表示呢?

从图5-25类的设计中可以清楚地发现,要是想清楚地表示出一个节点之后还有另外一个节点,可以在一个节点的内部存放下一个的引用。

图5-24 单向链表,只能从前向后找

图5-25 节点类设计

【例5.76】节点类

从上面代码的类中可以清楚地发现,每一个Node节点都有下一个Node对象的引用,那么具体的引用该如何设计呢?具体代码如下。

【例5.77】设置节点

从上面代码中可以清楚地发现,每一个节点都可以设置下一个节点,但是到第3个节点之后因为其不再有后续节点,所以不再单独设置关系。

以上的节点全部设置完成后,该怎么输出全部的节点呢?此时的节点很多,所以肯定要用循环的方式输出,基本的思路就是:判断一个节点之后是否还有后续节点,如果存在后续节点,则输出;如果不存在则不输出,输出可以使用方法的递归调用完成(递归调用就是自己调用自己),具体代码如下。

【例5.78】简单链表的设置及输出

上面程序中的printNode()方法就是采用了递归的调用形式,有时候也可以把这种输出形式称为迭代输出。

5.15.3 单向链表实现(2)

5.15.2节实现了一个简单单向链表,可是如果程序要按照以上的方式操作则肯定会很麻烦,因为要由用户手工去处理各个节点的关系,这样肯定是不行的,所以此处最好将节点的操作进行封装,这样用户使用起来就会比较方便。本节将介绍如何对节点的操作进行封装,假设现在的节点操作有增加数据、查找数据、删除数据3种。特别强调的是,如果要删除节点的话,则直接修改上一个节点的引用即可,如图5-26所示。

图5-26 删除节点

本节为了操作代码方便,使用了内部类的形式完成。

【例5.79】链表操作

程序执行结果:

上面的程序对要操作的节点类进行了包装,以后用户直接调用包装后的类,即可以方便地执行节点的增加、删除、查找操作。

提示

理解操作原理。

上面的程序只要理解其操作原理即可,在实际的使用中,Java已经为用户提供了大量的数据结构实现类,这些类都将在类集框架中介绍。