1、1第三章第三章 JavaJava基本程序结构基本程序结构3 31 Java1 Java应用程序结构应用程序结构3 32 Java2 Java数据类型数据类型3 33 Java3 Java常量和变量常量和变量3 34 Java4 Java运算符运算符3 35 Java5 Java流程结构流程结构3 36 Java6 Java键盘输入键盘输入3 37 Java7 Java数组数组3 38 foreach8 foreach循环循环23 31 Java1 Java应用程序结构应用程序结构package 包名;修饰符 类名 继承 父类名 执行接口名 类的变量定义类的构造方法定义类的方法定义Java的程序
2、,除了类是必须的,其它任何项都可以没有。无法给出一个通用的Java程序结构模板,下面,给出一个大致的结构,应该说,大多数的Java源程序都是按照下面的结构进行的:JavaSample.java3此外,与C/C+类似,Java的注释仍然为/、/*/和/*/。其中/表示单行注释,/*/表示多行注释,/*/表示文档注释。注释作为应用程序的一部分,虽然在执行时不被编译和运行,然而,给程序加上必要的注释,是一种良好的编程习惯,在方便他人阅读的同时,也为自己调试和记忆程序奠定了良好的基础。statement 注意,以上是Java源程序的结构,也就是以.java结尾的文件结构,而不是Java字节码的结构。具
3、体将.java源程序编译成什么形式的.class字节码,由JVM负责完成。4Java是强类型语言,每个变量、常量都必须属于且只能属于一种数据类型。3 32 Java2 Java数据类型数据类型使用变量和常量之前必须先定义变量或常量的数据类型,从而在编译时可以进行严格的语法检查,降低程序出错的概率。Java中共有八种基本数据类型,与之对应的是数值,此外还有四种引用数据类型,与之对应的是对象,具体如表3.1所示:56对于一个整数数值,Java默认类型总是int,因此在long型的数值尾部,需要加上英文字母L或其小写l用于确保它不是int型而是long型,我们建议用L,因为它的小写字母l实在跟数字1
4、很相近。对于一个浮点数值,Java默认类型总是double,因此float型的数值尾部,需要加上英文字母F或其小写f用于确保它不是double型而是float型。Java使用Unicode编码方式给字符编码。Java不能用0替代false,也不能用非0值替代true。73 33 Java3 Java常量和变量常量和变量3.3.1 Java命名规则Java的命名规则包括字母、数字、下划线和美元符号$,命名长度不受限制,不能以数字开头,不能与Java关键字和保留字同名,不能包含空格,并且Java命名区分大小写。这里的字母不仅仅是狭义上的英文字母,所有Unicode编码支持的书面语言中的字符都可以用
5、于命名。例如希腊文、俄文、中文我都可以用于命名。尽量使用英文字母、数字、下划线三种符号命名,命名要能顾名思义,看到命名就能知道它所表示的大概意思。83.3.2 Java常量Java中利用final关键字申明常量。常量一旦赋值就不能更改,否则程序会报错。常量尽可能的用大写字母表示。ConstantSample.java93.3.3 Java变量一般用驼峰命名法给变量起名,当变量名只有一个字母时,通常用小写字母表示;如果包括多个英文单词的话,除第一个单词之外,每个单词的首字母大写。VariableSample.java103.3.4 Java基本类型转换Java的八种基本数据类型,除布尔型之外,都
6、可以相互转换,转换的方式有两种:自动转换和强制转换。自动转换一般不会带来数据丢失等问题,而强制转换时,因为各种基本类型表示范围的不同,经常会引起数据丢失。类型转换并不影响变量本身的数值和数据类型。AutoConversionSample.javaCastConversionSample.java113 34 Java4 Java运算符运算符AddOperationSample.javaSubOperationSample.javaMultiplyOperationSample.javaDivideOperationSample.javaRemainderOperationSample.java
7、SelfAddOperationSample.java12CompareOperationSample.java13LogicOperationSample.java14条件运算符为?:,具体表达形式为:条件?表达式1:表达式2;当条件取true时,运算结果为表达式1的值,否则为表达式2的值。ConditionOperationSample.java赋值运算符主要用于对变量、常量等进行赋值,Java也采用=符号作为赋值运算符。=的左侧是被赋值的变量或常量,=的右侧是需要赋给的数据或者表达式。之前的示例已经给出很多赋值运算符的操作,在此不予赘述。153 35 Java5 Java流程结构流程结构
8、程序的流程执行结构包括顺序、分支和循环三种结构。顺序结构的代码执行顺序按照从上到下的流程执行,当中无任何的判断和跳转,因此也不存在控制的问题。分支结构存在判断问题,循环结构存在判断和跳转问题,根据判断或跳转的不同,程序执行的代码块也不同,因此,分支结构和循环结构都属于流程控制结构。Java还提供了break,continue和return关键字用于控制循环结构。163.5.1 分支结构Java提供两种分支结构控制语句:if语句和switch语句。在设计各分支条件的时候,应做到条件之间避免出现冗余的情况,例如,下列的语句中,else if语句及其控制的代码段是永远不会执行的。if(a10)sta
9、tement_1else if(a5)statement_2Sort2Num.javaSort3Num.javaAgeClass.java17switch语句通过一个表达式和case标签构成,这个表达式支持byte、short、char、int、String和枚举类型的数据。GradeAndMark.javaDaysJudge.javaDaysJudgeByString.java183.5.2 循环结构Java中,提供了while、do while和for三种循环语句,从本质上来看,这三种循环语句的功能是一致的。一般来说,循环语句由以下几部分组成:19SumWhile.javaSumDoWhi
10、le.javaSumFor.javaFactorial.javaFibonacci.javaDaffodilNmuber.javaPerfectNumber.javaSqrtX.java3.5.3 循环结构控制有的时候,我们希望在某种条件下能够强制退出循环,而不需要等到循环条件取值为false时再停止循环,这种强行中断循环的语句称为循环控制语句,在Java中,提供了break、continue和return三种循环控制语句。20break语句用于跳出当前循环。也就是说,如果程序执行到break语句,则完全跳出离break语句最近的那个循环,即使该循环中的剩余语句尚未执行完毕。与break语句不
11、同,continue语句只是用于停止当前的循环,接下来执行下一次的循环。当前被停止的循环的剩余语句,也不执行。与break、continue用于控制循环不同,return语句执行的是直接退出所在方法的操作。例如在某方法A中,程序执行到return语句后,A方法被结束,即使在return语句后还有其它代码没有执行。21BreakTest.javaLabelBreakTest.javaContinueTest.javaLabelContinueTest.javaReturnTest.javabreak语句与continue语句,除了对与之最近的循环有效外,还可以通过标签的方式来确定控制的循环。re
12、turn语句更多的用于为方法返回某个值,在第四章中会有更详细的说明。223 36 Java6 Java键盘输入键盘输入很多时候需要通过键盘录入数据为变量赋值,可以通过BufferedReader和Scanner类来进行处理,前者出现在早期的JDK1.5版本之前,后者从JDK1.5版本开始出现。3.6.1 通过BufferedReader类获取键盘输入数据BufferedReader br=new BufferedReader(new InputStreamReader(System.in);br是BufferedReader类的实例对象,获取键盘输入数据的操作将由这个对象完成。通过调用br的r
13、eadLine方法,可以逐行的读取键盘的输入,当输入一个回车时,readLine方法结束,并将回车前的数据以字符串形式返回。23BRInput.javaBRInputNmber.java3.6.2 通过Scanner类获取键盘输入数据Scanner类通过next方法得到键盘录入的字符串数据,也可以通过nextXxx方法得到键盘录入的某种基本数据类型的数据,其中Xxx表示某个基本数据类型。ScannerTest.javaScanner通过回车、空格、Tab作为输入项分隔符,输入项个数超过接收项时,超出部分被自动放弃。使用回车方式完成输入项录入,不会产生多余的输入项;使用空格或者Tab的方式完成输
14、入项录入时,有可能产生多余的输入项。ScannerException.java243 37 Java7 Java数组数组所谓数组,就是用于存放一组数据的有序集合,这组数据必须是同一数据类型,这个集合有固定的大小,也即数组的容量一旦指定以后就是固定不变的,无法更改。3.7.1 数组的定义type arrayName;type arrayName;其中type表示数组中存放的元素数据类型,也称数组类型,arrayName表示数组名。符号表示定义的是数组。第一种定义方式在实际开发中使用较多,第二种定义方法功能上与第一种没有区别,只是习惯上用的已经越来越少了。25数组在定义的阶段,是不指定容量(也即长
15、度)也不分配内存地址的,刚定义的数组,只是在程序中进行了一个申明的过程,不经过初始化的操作,是无法使用的。例如,有语句:int A;double B;则A数组和B数组此时均无法使用,也没有容量,内存中也不分配地址。263.7.2 数组的初始化所谓初始化,就是指为数组分配内存地址、设定数组容量、创建数组元素初始值。初始化的工作可以分为静态初始化和动态初始化两种形式。静态初始化是指通过指定数组元素的初始值来完成数组初始化的过程。动态初始化是指通过指定数组的容量大小来完成数组初始化的过程。27int A;double B;A=new int 4,8,20,11,5;B=new double 3.3,
16、1.5,-2,7,8.7,1.2,0.3;可以将数组定义和静态初始化的过程结合起来,这种方式更为简洁和直观:double X=0.1,5.2,3.7,4.6,9.9;(1)静态初始化经过静态初始化后,数组就分配了内存地址、设定了容量和初始元素。28char c;c=new char 5;与静态初始化类似,动态初始化也可以和数组定义结合起来:double X=new double 10;(2)动态初始化经过动态初始化后,数组也分配了内存地址、设定了容量和初始元素。293.7.3 数组的使用经过定义和初始化后的数组,就可以在程序中使用了。数组的使用是双向的,也就是说,程序通过数组元素的下标访问每一
17、个元素,既可以得到元素的值,也可以修改元素的值。但是,无论如何,修改数组容量的操作是不被允许的,Java也不提供这种方法。在Java的Arrays类和System类中,提供了一些常用的数组方法,可以直接用于数组操作的使用。UseArray.javaArraysUtil.java303 38 foreach8 foreach循环循环从JDK1.5版本开始,针对遍历数组和集合的操作,Java提供了一种更为方便和简洁的循环模式:foreach循环。foreach循环相比传统的for循环,在遍历数组时显得更为方便和简洁。需要指出的是,foreach循环并不是一种循环结构,而只是for循环在遍历数组或者集合元素时的一种简洁写法。ForEachTest.javabubSort.javafindPrime.javamatrixMultiply.java