Java从一无所知到入门.2
第 2 章 简单的 Java 程序
从本章开始,就要正式学习Java语言的程序设计,除了认识程序的架构外,本章还介绍了修饰符、关键字以及一些基本的数据类型。通过简单的范例,让读者了解到检测与提高程序可读性的方法,以培养读者正确的程序编写观念与习惯。
- 2.1 一个简单的例子
首先来看一个简单的Java程序。在介绍程序的内容之前,先简单回顾一下第一章讲解的例子,之后再来看下面这个程序,试试看是否看得出它是在做哪些事情!
范例: TestJava2-1.java 01 // TestJava2_1.java,java的简单范例 02 public class TestJava2_1 03 { 04 public static void main(String args[]) 05 { 06 int num ; //声明一个整型变量num 07 num = 3 ; //将整型变量赋值为3 08 // 输出字符串,这里用"+"号连接变量 09 System.out.println("这是数字"+num); 10 System.out.println("我有"+num+"本书!"); 11 } 12 }
输出结果: 这是数字3 我有3本书!
如果现在看不懂上面的这个程序也没有关系,先将它敲进Java编辑器里,将它存盘、编辑、运行,就可以看到上面的输出结果。
从上面的输出结果中可以看出System.out.println()的作用,就是输出括号内所包含的文字,至于public、class、static、void这些关键字的意思,将在以后的章节中再做更深入一层的探讨。
程序说明:
1、 第1行为程序的注释,Java语言的注释是以“/ /”标志开始的,注释有助于对程序的阅读与检测,被注释的内容在编译时不会被执行。
2、 第2行public class TestJava2_1中的public与class是Java的关键字,class为“类”的意思,后面接上类名称,在本程序中取名为TestJava2_1。public则是用来表示该类为公有,也就是在整个程序里都可以访问到它。 需要注意的是,如果将一个类声明成public,则也要将文件名称取成和这个类一样的名称,如图 2-1所示。本例中的文件名为TestJava2_1.java,而public之后所接的类名称也为TestJava2_1。也就是说,在一个Java文件里,最多只能有一个public类,否则.java的文件便无法命名。
图 2-1 如果将类声明成public,则也要将文件名称取成和这个类一样的名称
3、第4行public static void main(String args[])为程序运行的起点。第 4~10 行的功能类似于一般程序语言中的函数(function),但在Java中称之为method(方法)。因此C语言里的main()函数(主函数),在Java中则被称为main() method(主方法)。
4、main() method的主体(body)从第5行的左大括号“{”到第11行的右大括号“}”为止。每一个独立的Java程序一定要有main() method才能运行,因为它是程序开始运行的起点。
5、 第6行“intnum;”的目的是声明num为一个整数类型的变量。在使用变量之前必须先声明其类型。
6、第7行“num=3;”为一赋值语句,即把整数2赋给存放整数的变量num。
7、 第8行的语句为: System.out.println("这是数字"+num); 程序运行时会在显示器上输出引号(””)内所包含的内容。包括“这是数字”和整数变量num所存放的值两部分内容。
8、System.out是指标准输出,通常与计算机的接口设备有关,如打印机、显示器等。其后所需的文字println,是由print与line所组成的,意思是将后面括号中的内容打印在标准输出设备——显示器上。因此第8行的语句执行完后会换行,也就是把光标移到下一行的开头继续输出。读者可以把System.out.println(),改成System.out.print(),看一下换行与不换行的区别。
9、第10行的右大括号则告诉编译器main() method到这儿结束。
10、第11行的右大括号则告诉编译器class TestJava2_1到这儿结束。
这里只是简单的介绍了一下TestJava2_1这个程序,相信读者已经对Java语言有了初步的了解。TestJava2_1程序虽然很短,却是一个相当完整的Java程序!在后面的章节中,将会对Java语言的细节部分,做详细的讨论。
2.2 简单的 Java 程序解析 本节将仔细探讨Java语言的一些基本规则及用法。
2.2.1 类(class)
Java程序是由类(class)所组成,至于类的概念在以后会有详细讲解,读者只要先记住所有的Java程序都是由类组成的就可以了。下面的程序片段即为定义类的典型范例: public class Test // 定义public 类 Test { … }
上面的程序定义了一个新的public类Test,这个类的原始程序的文件名称应取名为Test.java。类Test的范围由一对大括号所包含。public是Java的关键字,指的是对于类的访问方式为公有。 需要读者注意的是,由于Java程序是由类所组成,因此在完整的Java程序里,至少需要有一个类。此外,本书曾在前面提到过在Java程序中,其原始程序的文件名不能随意命名,必须和public类名称一样,因此在一个独立的原始程序里,只能有一个public类,却可以有许多non-public类。 此外,若是在一个Java程序中没有一个类是public,那么该Java程序的文件名就可以随意命名了。
2.2.2 大括号、段及主体
将类名称定出之后,就可以开始编写类的内容。左大括号“{”为类的主体开始标记,而整个类的主体至右大括号“}”结束。每个命令语句结束时,必须以分号“;”做结尾。当某个命令的语句不只一行时,必须以一对大括号“{}”将这些语句包括起来,形成一个程序段(segment)或是块(block)。 再以一个简单的程序为例来说明什么是段与主体。若是暂时看不懂TestJava2_2这个程序,也不用担心,慢慢地都会讲到该程序中所用到的命令。在下面的程序中,可以看到main() method的主体以左右大括号包围起来;for循环中的语句不只一行,所以使用左右大括号将属于for循环的段内容包围起来;整个程序语句的内容又被第3与第13行的左右大括号包围,这个块属于public类TestJava2_2所有。此外,应该注意到每个语句结束时,都是以分号作为结尾。
范例: TestJava2_2.java
2.2.3 程序运行的起始点 —— main()method
Java程序是由一个或一个以上的类组合而成,程序起始的主体也是被包含在类之中。这个起始的地方称为main(),用左右大括号将属于main()段内容包围起来,称之为method(方法)。main()方法为程序的主方法,在一个Java程序中有且只能有一个main()方法,它是程序运行的开端,通常看到的main() method如下面的语句片段所示:
public static void main(String args[]) // main() method,主程序开始 { … }
如前一节所述,main() method 之前必须加上 public static void 这三个标识符。public 代表 main() 公有的method;static表示main()在没有创建类对象的情况下,仍然可以被运行;void则表示main()方法没有返回值。Main后的括号()中的参数String args[]表示运行该程序时所需要的参数,这是固定的用法,如果现在不了解也没有关系,在以后的章节中会一一介绍。
2.2.4 Java 程序的注释
为程序添加注释可以用来解释程序的某些语句的作用和功能,提高程序的可读性。也可以使用注释在原程序中插入设计者的个人信息。此外,还可以用程序注释来暂时屏蔽某些程序语句,让编译器暂时不要处理这部分语句,等到需要处理的时候,只需把注释标记取消就可以了,Java里的注释根据不同的用途分为三种类型:
· 单行注释 · 多行注释 · 文档注释
单行注释,就是在注释内容前面加双斜线(//),Java编译器会忽略掉这部分信息。如下所示: int num ; // 定义一个整数
多行注释,就是在注释内容前面以单斜线加一个星形标记(/*)开头,并在注释内容末尾以一个星形标记加单斜线(*/)结束。当注释内容超过一行时一般使用这种方法,如下所示:
/* int c = 10 ; int x = 5 ; */ 文档注释,是以单斜线加两个星形标记(/**)开头,并以一个星形标记加单斜线(*/)结束。用这种方法注释的内容会被解释成程序的正式文档,并能包含进如javadoc之类的工具生成的文档里,用以说明该程序的层次结构及其方法。
2.2.5 Java 中的标识符
Java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是Java中的保留关键字。
· 下面是合法的标识符: yourname your_name _yourname $yourname
·下面是非法的标识符: class 67.9 Hello Careers
!小提示:一些刚接触编程语言的读者可能会觉得记住上面的规则很麻烦,所以在这里提醒读者,标识符最好永远用字母开头,而且尽量不要包含其他的符号。
2.2.6 Java 的关键字
和其他语言一样,Java中也有许多保留关键字,如public、static等,这些保留关键字不能当作标识符使用。下面列出了Java中的保留关键字,这些关键字并不需要读者去强记,因为一旦使用了这些关键字做标识符时,编辑器会自动提示错误。 Java中的保留关键字: abstract boolea break byte case catch char class continue defaul do double else extend false final finally floatfor for if implement import instanceof int interface long native new null package private protected public return short static synchronized super this throw throws transient true try void volatile while
要特别注意的是,虽然goto、const在Java中并没有任何意义,却也是保留字,与其 它的关键字一样,在程序里不能用来做为自定义的标识符。
2.2.7 变 量
变量在程序语言中扮演了最基本的角色。变量可以用来存放数据,而使用变量之前必须先声明它所预保存的数据类型。接下来,来看看在Java中变量的使用规。
2.2.7.1变量的声明
则举例来说,想在程序中声明一个可以存放整数的变量,这个变量的名称为num,在程序中即可写出如下所示的语句: int num; //声明num为整数变量
int为Java的关键字,代表整数(Integer)的声明。若要同时声明多个整型的变量,可以像上面的语句一样分别声明它们,也可以把它们都写在同一个语句中,每个变量之间以逗号分开,如下面的写法: int num,num1,num2 ; // 同时声明num,num1,num2为整数变量
2.2.7.2变量的数据类型
除了整数类型之外,Java还提供了多种其它的数据类型。Java的变量类型可以是整型(int)、长整型(long)、短整型(short)、浮点型(float)、双精度浮点型(double)等,除了这些数据类型外,还有字符型(char)或字符串型(String)。关于这些数据类型,本书在第三章中有详细的介绍。
2.2.7.3变量名称
读者可以依据个人的喜好来决定变量的名称,这些变量的名称不能使用到Java的关键字。通常会以变量所代表的意义来取名(如num代表数字)。当然也可以使用a、b、c等简单的英文字母代表变量,但是当程序很大时,需要的变量数量会很多,这些简单名称所代表的意义就比较容易忘记,必然会增加阅读及调试程序的困难度。
2.2.7.4变量名称的限制 同2-2-5所述标识符的名称限制。
2.2.8变量的设置
给所声明的变量赋予一个属于它的值,用等号运算符(=)来实现。具体可使用如下所示的三种方法进行设置: 方法1——在声明变量的时设置 举例来说,在程序中声明一个整数的变量num,并直接把这个变量赋值为2,可以在程序中写出如下的语句: int num = 2 ;//声明变量,并直接设置 方法2——声明后再设置 一般来说也可以在声明后再给变量赋值。举例来说,在程序中声明整数的变量num1、num2及字符变量ch,并且给它们分别赋值,在程序中即可写出如下面的语句: int num1,num2 ; // 声明变量 char c ; num1 = 2 ; //赋值给变量 num2 = 3 ; ch = 'z' ; 方法3——在程序中的任何位置声明并设置 以声明一个整数的变量num为例,可以等到要使用这个变量时,再给它赋值: int num ; // 声明变量 … num = 2 ; // 用到变量时,再赋值
2 . 2 . 9 println ( )
读者会发现从第1章开始,所有的例题中出现了不少次的“System.out.println()”,在本节中,就先了解一下println()。至于详细的使用方法,在第三章会讲到。 System.out是指标准输出,通常与计算机的接口设备有关,如打印机、显示器等。其后所连接的println,是由print与line所组成的,意义是将后面括号中的内容打印在标准输出设备——显示器上。左、右括号之间的内容,即是欲打印到显示器中的参数,参数可以是字符、字符串、数值、常量或是表达式,参数与参数之间以括号作为间隔。当参数为字符串时以一对双引号(“”)包围;变量则直接将其名称作为参数;表达式作为参数时,要用括号将表达式包围起来。举例来说,想在屏幕上输出“我有20本书!”,其中20以变量num代替,程序的编写如下: 范例:TestJava2_3.java 01 //下面这段程序采用声明变量并赋值的方式,之后在屏幕上打印输出 02 public class TestJava2_3 03 { 04 public static void main(String args[]) 05 { 06 int num = 2 ;//声明变量并直接赋值为2 07 System.out.println("我有"+num+"本书!"); 08 } 09 } 输出结果: 我有20本书!
在TestJava2_3程序中,println()中的变量共有三个,以加号连接这些将被打印的数据。在此,加号是“合并”的意思,并非作为算术运算符号的用途。
2.3程序的检测
现在相信读者大概可以依葫芦画瓢似地写出几个类似的程序了,接下来,要对读者做一些小检测!看看读者是否能够准确地找出下面的程序是否存在错误:
范例:TestJava2_4.java 01 // 下面程序的错误属于语法错误,在编译的时候会自动检测到 02 public class TestJava2_4 03 { 04 public static void main(String args[]) 05 { 06 int num1 = 2 ;//声明整数变量num1,并赋值为2 07 int num2 = 3 ;声明整数变量num2,并赋值为3 08 09 System.out.println("我有"+num1"本书!"); 10 System.out.println("你有"+num2+"本书!") 11 ) 12 } 2.3.1语法错误
程序TestJava2_4在语法上犯了几个错误,若是通过编译器编译,便可以把这些错误找出来。首先,可以看到第4行,main() method的主体以左大括号开始,应以右大括号结束。所有括号的出现都是成双成对的,因此第11行main() method主体结束时应以右大括号做结尾,而Careers2_4中却以右括号“)”结束。 注释的符号为“//”,但是在第7行的注释中,没有加上“//”。在第9行,字符串的连接中少了一个“+”号,最后,还可以看到在第10行的语句结束时,少了分号作为结束。 上述的三个错误均属于语法错误。当编译程序发现程序语法有错误时,会把这些错误的位置指出,并告诉设计者错误的类型,即可以根据编译程序所给予的信息加以更正。将程序更改后重新编译,若还是有错误,再依照上述的方法重复测试,这些错误就将会被一一改正,直到没有错误为止。上面的程序经过检测、调试之后运行的结果如下:
输出结果
我有2本书!
你有3本书!
2.3.2语义错误
当程序本身的语法都没有错误,但是运行后的结果却不符合设计者的要求,此时可能犯了语义错误,也就是程序逻辑上的错误。读者会发现,想要找出语义错误会比找语法错误更难,以下面的程序进行简单的说明: 范例:TestJava2_5.java 01 //下面这段程序原本是要计算一共有多少本书,但是由于错把加号写成了减号, //所以造成了输出结果不正确属于语义错误 02 public class TestJava2_5 03 { 04 public static void main(String args[]) 05 { 06 int num1 = 4 ;//声明一整型变量num1 07 int num2 = 5 ;//声明一整型变量num2 08 09 System.out.println("我有"+num1+"本书!"); 10 System.out.println("你有"+num2+"本书!"); 11 // 输出num1-num2的值s 12 System.out.println("我们一共有"+(num1-num2)+ "本书! "); 13 } 14 }
输出结果:
我有4本书! 你有5本书! 我们一共有–1本书!
可以发现,在程序编译过程中并没有发现错误,但是运行后的结果却是不正确的,这种错误就是语义错误,就是在第12行中,因失误将“num1+num2”写成了“num1-num2”,虽然语法是正确的,但是却不符合程序的要求,只要将错误更正后,程序的运行结果就是想要的了。
2.4提高程序的可读性
能够写出一个程序的确很让人兴奋,但如果这个程序除了本人之外,其他人都很难读懂,那这就不算是一个好的程序,所以每个程序设计者在设计程序的时候,也要学习程序设计的规范格式,除了前面所说的加上注释之外,还应当保持适当的缩进,可以看见上面的范例程序都是按缩进的方法编写的,是不是觉得看起来很清晰、明白?读者可以比较下面两个程序,相信看完之后,就会明白程序中使用缩进的好处了!
范例:TestJava2_6.java
01 // 以下这段程序是有缩进的样例,可以发现这样的程序看起来比较清楚
02 public class Careers2_6
03 {
04 public static void main(String args[])
05 {
06 int x ;
07
08 for(x=1;x<=3;x++)
09 {
10 System.out.print("x = "+x+", ");
11 System.out.println("x * x = "+(x*x));
12 }
13 }
14 }
下面是没有缩进的例子:
范例:TestJava2_7.java
01 // 下面的程序于前面程序的输出结果是一样的,但不同的是,//这个程序没有采用任 何缩进,所以看起来很累
02 public class TestJava2_7{
03 public static void main(String args[]){
04 int x ; for(x=1;x<=3;x++){
05 System.out.print("x = "+x+", ");
06 System.out.println("x * x = "+(x*x));}}}
TestJava2_7这个例子虽然简短,而且语法也没有错误,但是因为编写风格的关系,阅读起来肯定没有TestJava2_6这个程序好读,所以建议读者尽量使用缩进,养成良好的编程习惯。
范例TestJava2_6和TestJava2_7运行后的输出结果如下:
x = 1 , x * x = 1
x = 2 , x * x = 4
x = 3 , x * x = 9