1、Java程序设计,重庆交大,22:36,上一章内容回顾,2. Java程序的组织形式及面向对象入门第2个Java程序VolcanoApplicationJava程序的基本规则:Java程序的组织形式;Java源文件的命名规则在NetBeans、Eclipse开发工具中组织多个Java程序的方法。面向过程与面向对象UML (统一建模语言)Java的面向对象特征一切都是对象类和对象类之间的主要结构,22:36,3. 数据类型、运算符、流程控制与数组,3.1 注释(包括文档注释)3.2 标识符和关键字3.3 数据类型分类:基本类型和引用类型3.4 基本数据类型3.5 运算符算术运算符、赋值运算符、比
2、较运算符、逻辑运算符三目运算符(即条件运算符)3.6 流程控制顺序结构;分支结构(或称为选择结构);循环结构控制循环结构(break, continue, return)3.7 数组类型3.8 深入数组,22:36,3.1 注释3.1.1 单行注释,Java语言中的单行注释与C+语言中的单行注释完全相同:以“/”开头。,package chapter03;import java.util.Scanner;/import java.lang.*; /lang包是默认导入的,这条语句可以注释public class prime public static void main(String argu
3、ments) /. for (i = 2; i = k; i+) if (m % i = 0) /*当找到第一个能整除m的i,设置prime为false 并提前退出循环*/ prime = false; break; /.,22:36,3.1 注释3.1.2 多行注释,Java语言中的多行注释与C+语言中的多行注释完全相同:使用“/*”和“*/”将程序中需要注释的内容包含起来,“/*”表示注释开始,而“*/”表示注释结束。,package chapter03;import java.util.Scanner;/import java.lang.*; /lang包是默认导入的,这条语句可以注释p
4、ublic class prime public static void main(String arguments) /. for (i = 2; i =!=,22:36,3.5 运算符3.5.4 逻辑运算符,&:逻辑与。其语法格式为:表达式1 & 表达式2。左右两个表达式的值均为true时,其值才为true。&是按短路原则进行运算,即如果表达式1的值为false,则不执行表达式2,因为整个表达式的值肯定为false。&:不短路与。|:逻辑或。其语法格式为:表达式1 | 表达式2。左右两个表达式的值均为false时,其值才为false。|是按短路原则进行运算,即如果表达式1的值为true,则
5、不执行表达式2,因为整个表达式的值肯定为true。|:不短路或。!:非:异或。其语法格式为:表达式1 表达式2。当左右两个表达式的值(true或false)不同时,整个表达式的值为true,否则为false。,22:36,3.5 运算符3.5.5 三目运算符(即条件运算符),与C+语言一样,Java语言中有唯一一个三目运算符:? :,该运算符也称为条件运算符。其语法格式为:表达式1 ? 表达式2 : 表达式3其运算规则为:先对逻辑表达式1求值,如果该值为ture,则返回表达式2的值;否则返回表达式3的值。,22:36,3.6 流程控制3.6.1 顺序结构,在面向对象程序设计中,类的方法也是用来
6、实现某个功能或行为的,也是通过三种基本结构(顺序、选择和循环)来实现的。Java语言中的顺序结构完全与C+语言中的顺序结构相同。,22:36,3.6 流程控制3.6.2 分支结构(或称为选择结构),Java语言中的选择结构完全与C+语言中的选择结构相同,也是通过if和switch语句来实现的。(1) if语句,22:36,3.6 流程控制3.6.2 分支结构(或称为选择结构),22:36,3.6 流程控制3.6.2 分支结构(或称为选择结构),(2) switch语句switch语句用来实现多分支选择结构。虽然嵌套结构的if语句也可以实现多分支,但如果分支较多,则嵌套的if语句层数多,程序就会
7、繁琐,而switch语句直接处理多分支选择,形式更简洁。switch语句的一般形式如下:switch( 表达式 )case 常量表达式1:语句序列1; breakcase 常量表达式2:语句序列2; break;.case 常量表达式n:语句序列n; break;default:语句n+1break语句可选。【思考】break语句的作用是什么,22:36,3.6 流程控制3.6.3 循环结构,与C+语言一样,Java语言中的循环也分为:while循环、do-while循环和for循环。(1) while循环while语句的一般形式如下:while(表达式) 语句;,22:36,3.6 流程控制
8、3.6.3 循环结构,(2) do-while循环do-while语句的一般形式为:do 语句while(表达式);,22:36,3.6 流程控制3.6.3 循环结构,(3) for循环for语句的一般格式为:for(表达式1;表达式2;表达式3) 语句;它的执行过程如下(如下图所示):(1) 先求解表达式1。(2) 求解表达式2,若其值为真(值为非0),则执行for语句的循环体语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3) 求解表达式3。(4) 转回上面第(2)步骤继续执行。(5) 循环结束,执行for语句下面的一个语句。,22:36,3.6 流程控制3.
9、6.3 循环结构,for循环非常灵活,但最简单、也是最容易理解的格式为:for( 循环变量赋初值; 循环条件; 循环变量增值 ) 循环体语句例1:输出所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如,153是一个“水仙花数”,因为153 = 13+53+33。(17, 例1.23),22:36,3.6 流程控制3.6.3 循环结构,/C语言实现#include void main( ) int a, b, c; /分别表示某个数的个位、十位和百位 for( int NUM=100; NUM=999; NUM+ ) a = NUM%10; /取个位 c =
10、 NUM/100; /取百位 b = (NUM/10)%10; /取十位 if( a*a*a + b*b*b + c*c*c = NUM ) printf( %dn, NUM ); ,/Java语言实现:chapter03daffodil.javapackage chapter03;public class daffodil public static void main(String arguments) int a, b, c; /分别表示某个数的个位、十位和百位 for (int NUM = 100; NUM = 999; NUM+) a = NUM % 10; /取个位 c = NUM
11、 / 100; /取百位 b = (NUM / 10) % 10; /取十位 if (a * a * a + b * b * b + c * c * c = NUM) System.out.println( + NUM); ,该程序的输出结果为:153370371407,22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),循环结构一般要循环到循环条件不满足时才会结束,如果想改变循环结构的执行,可以使用break、continue或return语句。(1) 用break语句结束循环与C+语言一样,break语句除了可以在switch结构中使用外
12、,还可以用于循环体内,其作用是使得流程从循环体内跳出循环体,即提前结束循环,接着执行整个循环语句后面的语句。(2) 用continue语句结束本次循环continue语句只能用于循环结构内,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。循环结构中的break语句和continue的区别如下图所示。,22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),例2:输入一个整数,判断其是否为素数。素数(也称
13、为质数)的定义是:若该数除1和本身之外不能被其他数整除,则该数为素数,否则为合数。(17, 例1.26)【预先学习】读取键盘输入在C+语言里,可以用scanf函数读取键盘输入。在Java语言里,一切都是类和对象。在Java语言里,读取键盘输入必须通过java.util包中的Scanner类来实现,详见JDK API文档,如下图所示。,22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),22:36,3.6 流程控制3.6.4 控制循环结构(b
14、reak, continue, return),【预先学习】数学函数的调用在C+语言里,头文件math.h中包含了很多数学函数的声明,要使用数学函数直接包含math.h头文件即可。在Java语言里,java.lang包中的Math类定义了许多方法,如sqrt、round、random等,实现了数学上的开平方根、四舍五入、生成随机数等功能。这些方法都是静态(static)方法,可以直接通过Math类来引用(无需定义Math类对象),详见JDK API文档,如下图所示。,22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),22:36,3.6 流程
15、控制3.6.4 控制循环结构(break, continue, return),22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),/C语言实现#include #include void main( ) int m, i, k; bool prime = true; /状态变量 scanf( %d, ,/Java语言实现:chapter03prime.javapackage chapter03;import java.util.Scanner;/import java.lang.*; /lang包是默认导入的,这条语句可以注释public
16、class prime public static void main(String arguments) int m, i, k; boolean prime = true; /状态变量 Scanner in = new Scanner(System.in); m = in.nextInt(); /k为小于等于根号m的最大正整数 k = (int) Math.sqrt(m); for (i = 2; i = k; i+) if (m % i = 0) /当找到第一个能整除m的i,设置prime为false prime = false; break; /并提前退出循环 if (prime) S
17、ystem.out.println(m + 是素数); else System.out.println(m + 是合数);,22:36,3.6 流程控制3.6.4 控制循环结构(break, continue, return),(3) 用return语句结束方法在C+语言里,return语句可以结束一个函数。与此类似,Java语言中的return语句也可以结束一个方法,一旦执行到return语句,方法就结束了。,22:36,3.7 数组类型,数组(Array)是程序设计语言中最常见的一种数据结构,用来存储多个相同类型的数据,每个数据称为数组元素(Element),可以通过数组元素的索引(或称为
18、下标)来访问数组元素,包括为数组元素赋值和取出数组元素的值。Java语言中的数组具有它特有的特征。,22:36,3.7 数组类型3.7.1 理解数组:数组也是一种数据类型,在Java语言里,在任何已有类型后加上方括号 ,又变成一种新类型,这种类型统称为数组类型。例如,int是基本类型,int 就是数组类型。Java的数组要求所有数组元素具有相同的数据类型。因此,一个数组里只能存储一种数据类型的数据。一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此数组的长度将不可改变。在Java语言里,可以定义存储基本类型数据的数组,也可以定义存储引用类型数据的数组。值得指出的是:数组也是一种数据
19、类型,它本身是一种引用类型。例如,int是一个基本类型,但int (这是定义数组的一种方式)就是一种引用类型了。,22:36,3.7 数组类型3.7.2 定义数组,Java语言支持两种语法格式来定义数组(注意,C+语言只支持第2种语法格式):type arrayName; /推荐采用type arrayName ; /合法,但不推荐采用对于这两种语法格式,一般推荐使用第一种格式。理由如下:因为第一种格式不仅具有更好的语意,也具有更好的可读性:对于“type arrayName;”,很容易理解这是定义一个变量,变量名是arrayName,而变量类型是type 。type 的确是一种新类型,与ty
20、pe类型完全不同。Java语言中的数组和C+语言中的数组差别很大,建议抛弃第二种格式,以免和C+语言中的数组相混淆。,22:36,3.7 数组类型3.7.2 定义数组,例子:int intArr; /定义数组intArr,其数据元素为基本数据类型intString sArr; /定义数组sArr,其数据元素为引用类型String,22:36,3.7 数组类型3.7.3 数组的初始化,Java语言中的数组必须先初始化,然后才可以使用。所谓初始化,就是为数组的元素分配内存空间,并为每个元素赋初始值。数组的初始化有两种方式:静态初始化:初始化时由程序员显式指定每个数组的初始值,由系统决定需要的数组长
21、度。动态初始化:初始化时程序员指定数组长度,由系统为数组元素分配初始值。,22:36,3.7 数组类型3.7.3 数组的初始化,(1) 静态初始化静态初始化的语法格式为:arrayName = new type element1, element2, element3, ;数组元素为基本数据类型的例子:静态初始化的语法格式可简化为:arrayName = element1, element2, element3, ;,因此,上述例子可简化为:int intArr;intArr = 5, 6, 8, 20;以上两条代码可合并为:int intArr = 5, 6, 8, 20;,int intA
22、rr; /定义一个int数组类型的变量,变量名为intArrintArr = new int 5, 6, 8, 20; /使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度,22:36,3.7 数组类型3.7.3 数组的初始化,(2) 动态初始化动态初始化只指定数组的长度,由系统为每个数组元素指定初始值。动态初始化的语法格式为:arrayName = new typeL;在上面的语法中,需要指定一个int整型的L参数,这个参数指定了数组的长度,也就是可以容纳数组元素的个数。数组元素为基本数据类型的例子:,数组元素为基本数据类型的例子:int intArr; /定义一个int数组
23、类型的变量,变量名为intArrintArr = new int5; /动态初始化数组intArr,申请一段存储空间,用来存储5个int型元素同样,以上两条代码可合并为:int intArr = new int5;,对比静态初始化和动态初始化,发现有何区别?arrayName = new type element1, element2, element3, ;arrayName = new typeL;,22:36,3.7 数组类型3.7.3 数组的初始化,执行动态初始化时,程序员只需指定数组的长度,系统自动为这些数组元素指定初始值。系统按如下规则指定初始值:数组元素的类型为基本类型中的整数类
24、型(byte, short, int和long),则数组元素的值为0;数组元素的类型为基本类型中的浮点类型(float和long),则数组元素的值为0.0;数组元素的类型为基本类型中的字符类型(char),则数组元素的值为u0000;数组元素的类型为基本类型中的布尔类型(boolean),则数组元素的值为false;数组元素的类型为引用类型(类、接口和数组),则数组元素的值为null。,22:36,3.7 数组类型3.7.3 数组的初始化,【注意】静态初始化和动态初始化不能同时使用,也就是说不要在进行数组初始化时,既指定数组的长度,又为每个数组元素分配初始值。因此,以下定义数组的方式是错误的。
25、int intArr = new int51, 4, 5, 7, 9;,22:36,3.7 数组类型3.7.4 使用数组(即引用数组元素),数组最常用的用法就是访问数组元素,包括对数组元素赋值和访问数组元素的值,访问数组元素是通过在数组引用变量后紧跟一个方括号( ),方括号里是数组元素的索引值。Java语言的数组索引是从0开始的,也就是说,第一个数组元素的索引值为0,最后一个数组元素的索引为数组长度减1。如果访问数组元素进指定的索引小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运行时出现异常:java.lang.ArrayIndexOutOfBoundsException:2(数
26、组索引越界异常) 。所有数组都提供了一个length属性,通过这个属性可以访问到数组的长度,一旦获得了数组的长度后,就可以通过循环来遍历该数组的每个数组元素。如下面的例子。,22:36,3.7 数组类型3.7.4 使用数组(即引用数组元素),程序清单:chapter03TestArray.java,package chapter03;public class TestArray public static void main(String args) /定义一个int数组类型的变量,变量名为intArr. int intArr; /使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组
27、长度。 intArr = new int5, 6, 8, 20; /定义一个String数组类型的变量,变量名为strArr. String strArr; /使用静态初始化,初始化数组时数组元素类型是定义数组时数组元素类型的子类 strArr = new StringJava, 李刚; String strArr2; /使用静态初始化 strArr2 = new StringJava, 李刚; /数组的定义和初始化同时完成,使用简化的静态初始化写法 int a = 5, 6, 7, 9; /数组的定义和初始化同时完成,使用动态初始化语法 int prices = new int5;,22:3
28、6,3.7 数组类型3.7.4 使用数组(即引用数组元素),/数组定义和初始化同时完成,初始化数组时元素类型是定义数组时元素类型的子类 String books = new String4; /输出strArr数组的第二个元素,将输出字符串李刚 System.out.println(strArr1); /为strArr2的第一个数组元素赋值 strArr20 = Spring; /访问数组元素指定的索引等于数组长度,所以下面代码将在运行时出现异常 /System.out.println(strArr22); /使用循环输出prices数组的每个数组元素的值 for (int i = 0; i prices.length; i+) System.out.println(pricesi); /对动态初始化后的数组元素进行赋值 books0 = Struts2权威指南; books1 = 轻量级J2EE企业应用实战; /使用循环输出books数组的每个数组元素的值 for (int i = 0; i books.length; i+) System.out.println(booksi); ,