Java常用算法手册(第3版)
上QQ阅读APP看书,第一时间看更新

1.6 Java程序的基本结构

Java语言的程序流由若干条语句组成。在此之前所编写的程序都是一行一行的,由上而下,从左到右执行的。如果程序只能这样执行,那么程序能做的工作将会受到限制。有时可能需要控制程序执行的过程,例如,重复执行某一程序段或当一个条件出现时才执行某一程序段,而这些变化可以通过流程控制结构的相应语句来完成。

三种基本的程序结构分别为顺序结构、分支结构和循环结构。顺序结构是每条代码都按照先后顺序被执行一次;分支结构是仅有部分代码被执行一次;循环结构是部分代码在某种条件下被反复执行。Java中还有一种特殊的程序结构称为跳转,可以用break或continue来改变程序的执行,实现跳转。这些基本的程序结构语句,看起来很简单,但其各种组合,一起构成了千变万化的算法,所以,学习算法之外,还要掌握一种实现算法的程序语言基本语句。本书讲解的是Java,读者也可以把它们转化成其他程序设计语言。

1.6.1 类是一个基本单元

编写程序,特别是阅读程序之前,首先需要了解程序的基本结构和组成单元,以方便剖析代码的组成。Java是面向对象的编程语言,不同于Pascal、C等面向过程的编程语言。面向对象编程用不同的方法分析和解决问题。熟悉C语言的读者在用Java编程时不能照搬传统的面向过程的求解问题的方法,而必须先将自己的思想转入一个面向对象的世界。但这种转变比较难,读者首先需要熟悉面向对象设计和编程的基本思想和基本概念。

面向对象编程(Object Oriented Programming,简称OOP)用与现实世界更一致、与人的思维模式更一致的方法来分析解决问题。面向对象编程的核心是“对象”。在现实世界中,人们无时无刻不与对象打交道。例如,磁盘、电视机、汽车、轮胎、人等,这一切都是对象。对象有两个基本特点:状态和行为。例如,汽车有质量、颜色和速度等状态,也有启动、转弯、加速等操作;人有独特的状态:名字、高矮、性别、健康等,而且还具有行走、休息和工作等行为。软件对象根据现实世界的对象建立,既可以表示现实世界中的事物,也可以表示事件。

在面向对象编程中,有很多对象共享某些属性和方法。可以利用同一类的对象共享一些属性和方法的特点,创造一个创建对象的母体。这种软件母体称为类。也就是说,类是定义同一类对象的属性和方法的蓝图或原形,对象是类的一个实例。

Java提供了几千种类,有的用于图形界面设计,有的用于数据库操作,有的用于网络编程等。另外,应用开发人员为解决实际问题也可创建用户自定义类。

类是面向对象程序的基本要素。它包含两个部分:类说明和类的主体。

类的定义格式如下:

与C++不同,Java中即使是一个最简单的程序也必须写成类。而C++中,简单的程序中完全可以不出现类,写一个main函数就可以了。要注意Java和C++在这一点上的区别。

说明:类的说明部分是用户可见部分。在这个部分对类的一些性质进行声明,包括类的修饰符、类名等。

(1)修饰符:是影响类生存空间和可访问性的关键字。常用的一种修饰符是public。它表示允许其他任何类访问。修饰符缺省时,这个类称为友好类。

(2)类名:紧跟在关键字class之后,类名的命名要符合Java标识符的命名规则,类的主体由两部分构成:变量定义和方法定义。变量用来描述属性,方法用来描述行为。类实体跟在类的声明之后,用一对花括号{}界定。

1.6.2 main方法

在C++程序中,main方法的声明可以是int main()或void main(),相对比较灵活。而在Java中,main方法作为Java应用程序的入口,写法基本是固定的,例如:

public static void main(String args[])

唯一可以做修改的是main方法中传递的字符数组的名称,可以不用args的名称。还有,按照Java语言的约定,声明数组时方括号也可以紧跟类型。main方法还可以写成:

public static void main(String[] yourName)

实际上不管上面的哪种写法,可以看到:

(1)main方法必须定义成public,即公有的;

(2)main方法必须定义成static,即静态方法;

(3)main方法的返回类型固定为void;

(4)main方法接收一个字符串数组作为参数。

读者在刚开始学习Java时,可能觉得main方法的书写太烦琐,多写一些程序后,逐步就会习惯了。main方法的固定写法,必须要牢记。而当以后使用集成开发环境后,写main方法相对就比较简单。在NetBeans中,输入psvm后按展开模板键(默认是Tab键,可以设置为空格键或Enter键),就可以自动填充main方法。

1.6.3 自定义方法

软件对象是变量和方法的集合。根据现实世界的对象建立,软件对象与客观世界的对象存在着一一对应的映射关系。面向对象语言用变量描述对象的状态,用方法描述对象的行为。

方法声明的基本格式如下:

方法声明的第一行是方法头。

(1)方法名是一个标识符。参数列表用圆括号界定,参数之间用逗号分隔。每个参数由参数类型和参数名组成。参数类型可以是基本数据类型,也可以是类。

(2)方法名前必须指明方法返回值的类型。返回值类型可以是基本类型或引用类型。若方法无返回值,则返回值类型是void。一个方法最多返回一个值。若方法需要返回计算结果,可用带表达式的return语句。若无返回值,可以不用return语句,或者使用不带表达式的return语句,即:

return;

(3)参数表由0个或多个参数构成。每个参数包括参数类型和参数名。参数类型可以是基本类型,也可以是引用类型。

(4)修饰符是可选项,public和private是常用的修饰符。在方法头后面是方法体,由花括号界定方法体,包括变量声明和语句。

方法体中声明的变量是局部变量,只有在该方法内才有效。如果局部变量与类的成员变量同名,则局部变量屏蔽类的成员变量。局部变量和成员变量的另一个区别是,成员变量有默认值,而局部变量却没有。

1.6.4 System.out.println的使用

System是位于java.lang包下的一个常用类。java.lang包称为Java的核心包,在这个包下的类可以直接使用,无须使用import语句导入。System类提供了很多的常用方法,如currentTimeMillis方法可以得到时间信息,getProperties方法可以得到当前计算机系统的相关信息。System类中有一个静态的对象out,out是PrintStream的对象,提供了print和println这样的常用方法,用于在控制台上输出信息。具体要在控制台上输出信息时,使用“System.out.println(参数);”的语法形式即可。

此外,为了在控制台得到输出结果,也可以使用“System.out.print(参数);”的语法形式。这里使用的print方法与println方法的区别是:print在显示参数后,并不将光标移动到下一行的开头,而println()在显示参数后,自动将光标位置移到下一行(与文本编辑器里按Enter键类似)。此外Java也可以使用System.out.printf()完成数据的输出,该用法完全类似于C语言的printf函数。System.out.printf()的一般格式如下:

System.out.printf(格式控制部分,表达式1,表达式2,…);

格式控制部分由普通字符和%d、%s、%f、%ld之类的格式控制符号组成,普通字符原样输出,格式符号用来输出表达式的值。例如:

System.out.printf("%d和%d的和为:",a,b,a+b);

1.6.5 一个简单而完整的程序

编写Java程序,打印几个特定字符的ACSII码,包括数字0和9,大写字母A和Z,小写字母a和z。

【程序1-2】

【分析】程序中dispAscii方法的声明为public void dispAscii(char ch),它的功能是接收一个字符类型的变量,将这个字符对应的ASCII码打印在控制台上。此方法不是静态(static)方法,因此,应该使用“对象名.方法名(参数)”的语法形式来调用。在调用println方法时,使用了加号将多个部分连接起来。

打印特定字符的ASCII码如图1-21所示。

图1-21 打印特定字符的ASCII码