
3.5 项目案例
3.5.1 学习目标
通过本案例可以更感性地认识以下内容,达到以下学习目标:
(1)标识符、关键字和数据类型的种类以及写法。
(2)熟练掌握初级的运算符与表达式。
(3)熟练掌握运算符与表达式的操作。
(4)清楚理解与掌握程序控制结构选择与循环的用法。
(5)熟练掌握操作数组的创建与访问。
3.5.2 案例描述
本案例是在系统中模仿实现程序中的登录功能。
通过定义用户名、密码两个固定变量,与登录用户的输入信息进行比较,判断是否可以通过登录验证。
3.5.3 案例要点
本案例是对真实系统的模拟,这里省略了前台页面的登录界面与后台的数据库部分,因此在编写代码过程中需要注意以下两点:
(1)用户名与密码的信息可存储在两个自定义的字符串中,以模仿前台页面的数据。
(2)数据库的信息可通过自定义的数组模拟。
3.5.4 案例实施
本案例具体实施步骤如下。
(1)编写一个类Login.java。

(2)定义一个成员数组保存有效用户的信息。

(3)定义一个login()方法对用户登录进行有效性检查。

(4)定义main()方法,定义两个变量作为要登录的用户信息并进行测试。

3.5.5 特别提示
几点特别提示如下:
(1)本案例中,字符串的截取操作是通过手动编程来实现的,但是在Java提供的类的方法中,存在一个更简单的方法来实现这个功能,这个类就是StringTokenizer,有兴趣的读者可以自行测试。
(2)String类型的数据进行比较的时候,用==与equals()是有区别的。
①==比较的是一个对象在内存中的地址值,例如两个字符串对象:

如果用==号比较,会返回false,因为创建了两个对象,它们在内存中地址的位置是不一样的。
②equals()的情况比较复杂,它是java.lang.Object类中的一个方法。因为Java中所有的类都默认继承于Object,所以所有的类都有这个方法。
在Object类源码中是这样写的:

上述源码中同样使用==号进行内存地址的比较。但是,许多Java类中都重写了这个方法,例如下列程序中的String。

String里的方法,如果==号比较不相等,还会进行值的比较。所以equals()方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么equals()和==等价。
3.5.6 拓展与提高
请思考以下问题:
(1)本案例中,有效用户的信息存放在一个一维数组中,每一个数组元素包含一个用户的用户名和密码两个信息。如果把这个信息放在一个二维数组里,每一个数组元素或者是用户名,或者是密码,这样应该怎么存放呢?
(2)本案例中检验一个用户信息的有效性中,采用的是for循环的语法,如果采用while循环或do…while循环应该如何操作呢?
(3)本案例中的用户验证操作,在验证失败时只给出了一个“用户名或密码错误!”的提示信息,能否通过逻辑判断给出更详细的提示信息呢(如“密码不能为空!”)?