第 3 章 程序控制结构与数组 本章学习目标 ● 掌握分支语句的使用方法。 ● 掌握循环控制语句的使用方法。 ● 掌握关键字break和continue的使用方法。 ● 掌握一维数组和二维数组的使用方法。 通常情形下,程序代码按照从上往下顺序地执行。但在解决一些实际问题 时,需先对一些条件进行判断,然后再决定执行哪段代码,或者当满足一定的条 件时重复地执行某种操作,即要对程序运行进行控制,这就是程序控制结构。 此外,当程序需要处理较多数据时,仅通过定义变量难以完成,通常需要使用数 组来存储数据并对数据进行各种处理。本章主要介绍分支和循环两种程序控 制结构,以及数组数据类型。 .. 3.1 分支语句 分支语句分为if结构和switch结构两类。if结构具有三种形式,分别是单 分支if语句、双分支if…else语句、多分支if…elseif语句,下面将逐一介绍。 3.1.1 if语句 if语句是单分支结构。它的作用是判断某个条件,如果条件成立,则执行某 个操作。其语法格式如下。 if(判断条件) { 执行语句 } 上述语法格式中,判断条件是一个布尔值。当判断条件为true时,就会执 行if后面{}中的执行语句。if语句的执行流程如图3.1所示。 第3章 程序控制结构与数组 43 图3.1 if语句的执行流程 ex3_1 【例3-1】 if语句实例。 0001 public class Example3_1 0002 { 0003 public static void main(String[]args) 0004 { 0005 int score = 80; 0006 if (score >= 60) 0007 { 0008 System.out.println("分数为" + score + ",成绩合格。"); 0009 } 0010 } 0011 } 【运行结果】 程序运行结果如图3.2所示。 图3.2 if语句实例输出 【程序说明】 程序第5行定义了int类型的变量score,表示某门课程成绩,并赋值为80分;第6行 在if语句中设置判断条件为成绩大于或等于60分,即score>=60,显然条件是成立的, 将会选择执行if后面{}中的执行语句,从而输出“成绩合格”的信息。 特别地,当if后面{}中的执行语句只有一条时,可以省略{}。 3.1.2 if…else语句 if…else语句是双分支结构。它的作用是判断某个条件,如果条件成立,则执行某个 操作,否则将执行另外某个操作。其语法格式如下。 44 Java程序设计(微课版) if(判断条件) { 执行语句1 }e lse { 执行语句2 } 上述语法格式中,判断条件是一个布尔值。当判断条件为true时,执行if后面{}中 的执行语句1,否则执行else后面{}中的执行语句2。if…else语句的执行流程如图3.3 所示。 图3.3 if…else语句的执行流程 ex3_2 【例3-2】 if…else语句实例。 0001 public class Example3_2 0002 { 0003 public static void main(String[]args) 0004 { 0005 int score = 50; 0006 if(score >= 60) 0007 { 0008 System.out.println("分数为" + score + ",成绩合格。"); 0009 } 0010 else 0011 { 0012 System.out.println("分数为" + score + ",成绩不合格。"); 0013 } 0014 } 0015 } 【运行结果】 程序运行结果如图3.4所示。 第3章 程序控制结构与数组 45 图3.4 if…else语句实例输出 【程序说明】 程序第5行定义了int类型的变量score,表示某门课程成绩,并赋值为50;在if… else语句中设置判断条件为成绩大于或等于60分,即score>=60,显然条件是不成立 的,那么会选择执行else后面{}中的执行语句,从而输出“分数为50,成绩不合格”的 信息。 ex3_3 【例3-3】 判断奇偶性实例。 0001 import java.util.Scanner; 0002 public class Example3_3 0003 { 0004 public static void main(String[]args) 0005 { 0006 Scanner scan = new Scanner(System.in); 0007 int x = scan.nextInt(); 0008 if(x % 2 == 0) 0009 System.out.println(x + "是偶数"); 0010 else 0011 System.out.println(x + "是奇数"); 0012 scan.close(); 0013 } 0014 } 【运行结果】 程序运行结果如图3.5所示。 图3.5 判断奇偶性实例输出 【程序说明】 程序第7行从键盘读入一个整型值存储在变量x中,然后通过if…else语句判断其 奇偶性,判断条件设置为x%2==0,程序运行并输入“2022”后,显然条件满足,所以执行 if后面的语句块,即第9行,输出“2022是偶数”。 46 Java程序设计(微课版) 3.1.3 if…elseif语句 if…elseif语句是多分支结构。它的作用是先判断第一个条件,如果该条件成立,则 执行第一段代码;否则将判断第二个条件,如果该条件成立,则执行第二段代码;否则继续 判断下一个条件,以此类推。其语法格式如下。 if(判断条件1) { 执行语句1 }e lse if(判断条件2) { 执行语句2 } …e lse if(判断条件n) { 执行语句n }e lse { 执行语句n+1 } 上述语法格式中,判断条件均为布尔值。当判断条件1为true时,执行if后面{}中 的执行语句1;否则继续判断条件2,当判断条件2为true时,执行elseif后面{}中的执行 语句2,以此类推。当判断条件1~判断条件n均为false时,则执行else后面{}中的执行 语句n+1,if…elseif语句的执行流程如图3.6所示。 图3.6 if…elseif语句的执行流程 第3章 程序控制结构与数组 47 ex3_4 【例3-4】 if…elseif语句实例。 0001 public class Example3_4 0002 { 0003 public static void main(String[]args) 0004 { 0005 /* 本程序的功能是根据课程成绩划分等级,设分数与等级的对应关系: 0006 85~100,A 等;75~84,B 等;60~74,C 等;0~59,D 等*/ 0007 int score = 83; 0008 if(score >= 85) 0009 System.out.println("成绩为A 等"); 0010 else if(score >= 75) 0011 System.out.println("成绩为B 等"); 0012 else if(score >= 60) 0013 System.out.println("成绩为C 等"); 0014 else 0015 System.out.println("成绩为D 等"); 0016 } 0017 } 【运行结果】 程序运行结果如图3.7所示。 图3.7 if…elseif语句实例输出 【程序说明】 程序第7行定义了一个score变量表示成绩;程序第8~15行使用if…elseif语句根 据成绩分为A、B、C、D共4个等级,设置相应条件及执行语句,共4个分支。score值为 83,和第一个elseif的条件匹配,因此输出“成绩为B等”。 3.1.4 switch语句 switch语句是一种常用的多分支结构语句,它由一个switch测试表达式和多个case 测试项组成。与if语句中的判断条件不同,switch测试表达式的类型只能是byte、short、 char、int、enum 枚举以及String类型,而非boolean类型。其语法格式如下。 switch(测试表达式) { case 测试项1: 执行语句1; 48 Java程序设计(微课版) break; case 测试项2: 执行语句2; break; … case 测试项n: 执行语句n; break; default: 执行语句n+1; } switch语句执行的流程是,将测试表达式的值逐个与case后的测试项进行匹配,如 果某个case项匹配成功了,则执行该case项后面的所有语句,直到switch结构结束。因 此,为了只执行匹配的那个case语句,在case语句后面通常会使用break关键字。如果 没有任何一个case项匹配成功,那么将执行default后的语句。 ex3_5 【例3-5】 switch语句实例。 0001 public class Example3_5 0002 { 0003 public static void main(String[]args) 0004 { 0005 int month = 10; 0006 switch(month) 0007 { 0008 case 1: 0009 case 2: 0010 case 12: 0011 System.out.println("当前为" + month + "月,是冬季"); 0012 break; 0013 case 3: 0014 case 4: 0015 case 5: 0016 System.out.println("当前为" + month + "月,是春季"); 0017 break; 0018 case 6: 0019 case 7: 0020 case 8: 0021 System.out.println("当前为" + month + "月,是夏季"); 0022 break; 0023 case 9: 0024 case 10: 0025 case 11: 第3章 程序控制结构与数组 49 0026 System.out.println("当前为" + month + "月,是秋季"); 0027 break; 0028 default: 0029 System.out.println("月份应该在1~12 之间"); 0030 } 0031 } 0032 } 【运行结果】 程序运行结果如图3.8所示。 图3.8 switch语句实例输出 【程序说明】 程序将变量month的值与各个case后的值进行匹配,执行到第24行匹配成功,并继 续往下执行,执行到第27行的break语句跳出switch结构。读者可以尝试将第27行代 码注释后再运行,来更好地理解switch结构的执行流程。此时将输出两行信息“秋季” “月份应该在1~12之间”,因为执行到第24行匹配后,将继续往下执行,直到switch结 构结束,中间未遇到跳出语句break。 .. 3.2 循环控制语句 除了分支结构之外,另一种重要的程序控制结构是循环结构,通过它可以实现一些操 作的重复执行。本节将介绍循环控制语句的三种主要形式,分为while循环、do… while 循环和for循环。 3.2.1 while语句 while语句在形式上与3.1.1节中的if语句相似,都是根据条件判断来决定是否执行 {}中的语句。区别在于,while语句会反复进行循环条件测试,只要循环条件成立,就继 续执行{}中语句,如果循环条件不成立,则结束while循环。其语法格式如下。 while (循环条件) { 循环体 } 上述语法格式中,循环条件是一个布尔值,花括号{}之间的执行语句称为循环体,其 50 Java程序设计(微课版) 执行流程如图3.9所示。首先,判断循环条件,如果条件成立,则执行循环体,然后继续判 断条件;如果条件不成立,则终止循环结构。 图3.9 while语句的执行流程 ex3_6 【例3-6】 while语句实例。 0001 public class Example3_6 0002 { 0003 public static void main(String[]args) 0004 { 0005 int sum = 0; 0006 int i = 1; 0007 while (i <= 1000) 0008 { 0009 sum += i; 0010 i++; 0011 } 0012 System.out.println("1~1000 的和为: " + sum); 0013 } 0014 } 【运行结果】 程序运行结果如图3.10所示。 图3.10 while语句实例输出 【程序说明】 本程序的功能是求1+2+3+…+1000的和。在使用循环结构时,首先需在循环结 构之前完成相关变量初始化,即程序第5~6行;其次确定循环条件,控制循环的进行和终 止,即程序第7行;最后应分析循环重复执行的操作,确定循环体的内容,如例3-6中重复 执行的操作即累加求和,即程序第9~10行。 第3章 程序控制结构与数组 51 ex3_7 【例3-7】 判断自然数位数实例。 0001 public class Example3_7 0002 { 0003 public static void main(String[]args) 0004 { 0005 int n = 2022; 0006 int count = 0; 0007 int tmp = n; 0008 while (tmp != 0) 0009 { 0010 tmp /= 10; 0011 count++; 0012 } 0013 System.out.println(n + "是" + count + "位数"); 0014 } 0015 0016 } 【运行结果】 程序运行结果如图3.11所示。 图3.11 判断自然数位数实例输出 【程序说明】 本程序的功能是求解一个整数的位数。程序第6行,初始化工作是设置计数器变量 初值为0;程序第8行,循环条件是商不为0;程序中第10~11行为重复的操作,即以n不 断除以10,并使用变量count计算自然数位数。 3.2.2 do…while语句 do…while语句与while语句功能类似,其语法格式如下。 do { 循环体 } while(循环条件); do…while语句的执行流程如图3.12所示。 do…while语句与while语句的区别在于: 52 Java程序设计(微课版) 图3.12 do…while语句的执行流程 ● do…while先执行循环体,再进行循环条件判断,称为直到型循环结构。 ● while语句是先进行循环条件判断,再执行循环体,称为当型循环结构。 ex3_8 【例3-8】 do…while语句实例。 0001 public class Example3_8 0002 { 0003 public static void main(String[]args) 0004 { 0005 int m = 21; 0006 int n = 35; 0007 int r; 0008 int t1 = m, t2 = n; 0009 do 0010 { 0011 r = m % n; 0012 m = n; 0013 n = r; 0014 } while(r != 0); 0015 System.out.println(t1 + "和" + t2 + "的最大公约数: " + m); 0016 } 0017 } 【运行结果】 程序运行结果如图3.13所示。 图3.13 do…while语句实例输出 【程序说明】 求两个自然数m、n的最大公约数应用欧几里得算法,其步骤如下。 第一步:求m 除以n的余数,即r=m%n。 第3章 程序控制结构与数组 53 第二步:用除数和余数分别替换被除数m 和除数n,即m=n;n=r。 第三步:判断余数。若余数为0,则m 即最大公约数;否则,返回步骤一。 上述例子中,先执行求余数、更新被除数和除数操作,然后再进行条件判断,最后决定 是否重复执行相同操作,比较适合使用do…while循环。 当然,while循环和do…while循环这两种结构也是可以转换的。如上述例子应用 while循环同样可以实现,应用while循环求最大公约数的主要代码如下。 int r = 1; //先给r 赋一个不为0 的值,目的是控制循环进行 while (r != 0) { r = m % n; m = n; n = r; } 3.2.3 for语句 当一个循环结构在执行之前可以确定循环次数时,通常使用for语句,其语法格式 如下。 for(初始化赋值语句; 循环条件; 操作表达式) { 循环体 } 图3.14 for语句的执行流程 上述语法格式中,for关键字后面括号()中包含三部 分内容:初始化赋值语句、循环条件、操作表达式,它们之 间用英文半角分号“;”分隔,后面跟花括号{},其中的执行 语句为循环体。for循环执行流程如下。 第一步:执行初始化赋值语句。该部分可为空,也可 对一个或多个变量赋值。 第二步:判断循环条件。如条件为true,则执行第三 步;否则,执行第五步。 第三步:执行循环体语句。 第四步:执行操作表达式,然后跳转到第二步。 第五步:退出for循环。 for语句的执行流程如图3.14所示。 ex3_9 【例3-9】 for语句实例。 0001 public class Example3_9 0002 { 54 Java程序设计(微课版) 0003 public static void main(String[]args) 0004 { 0005 int i, sum = 0; 0006 for(i = 1; i <= 1000; i++) 0007 { 0008 sum += i; 0009 } 0010 System.out.println("1~1000 的和: " + sum); 0011 } 0012 } 【运行结果】 程序运行结果如图3.15所示。 图3.15 for语句实例输出 【程序说明】 将本例与例3-6比较会发现,for循环的循环体只有一条累加求和语句,见程序第8 行,而循环的控制完全地包含在for语句中。 for循环的重要特征是,通常有一个控制循环的变量,称为循环控制变量,它具有初 值、终值和变化步长。例如上述例子中,循环控制变量i的初值为1、终值为1000、步长为 1(即i+ + 操作,每次增加1),该循环执行次数为(终值- 初值+1)÷ 步长,即循环 1000次。 3.2.4 break和continue关键字 break和continue是Java关键字,也是Java中的跳转语句,用于实现循环语句执行 过程中程序流程的跳转。 1.break关键字 在switch语句和循环结构中都可以使用break语句。在switch语句中使用break 是为了某个case执行后即终止并跳出switch结构。在循环结构中使用break的作用是 跳出当前循环,执行循环结构后面的代码。 ex3_10 【例3-10】 break语句实例。 0001 public class Example3_10 0002 { 0003 public static void main(String[]args) 第3章 程序控制结构与数组 55 0004 { 0005 int n = 25; 0006 int i; 0007 for(i = 2; i <= n - 1; i++) 0008 { 0009 if(n % i == 0) 0010 break; 0011 } 0012 if(i <= n - 1) 0013 System.out.println(n + "不是素数"); 0014 else 0015 System.out.println(n + "是素数"); 0016 } 0017 } 【运行结果】 程序运行结果如图3.16所示。 图3.16 break语句实例输出 【程序说明】 本程序的功能是判断给定的整数是否为素数,判断的方法是根据素数的定义。对于 整数n,测试[2,n-1]的范围内是否存在能够被n整除的数,若有,那么n就不是素数;否 则,表明n是素数。 例3-10中,当代码执行到第12行时,有两种可能,一种是因为某个i使得程序第9行 条件满足,通过第10行break语句跳出循环;另一种是for循环次数用尽,循环结构自然 结束。前者对应n不是素数,后者对应n是素数。 2.continue关键字 continue语句的作用是终止本次循环,继续下一次循环。 ex3_11 【例3-11】 continue语句实例。 0001 public class Example3_11 0002 { 0003 public static void main(String[]args) 0004 { 0005 int n = 25; 0006 int i; 56 Java程序设计(微课版) 0007 for(i = 2; i <= n - 1; i++) 0008 { 0009 if(n % i != 0) 0010 continue; 0011 else 0012 { 0013 System.out.println(n + "不是素数"); 0014 return; 0015 } 0016 } 0017 System.out.println(n + "是素数"); 0018 } 0019 } 【运行结果】 程序运行结果如图3.17所示。 图3.17 continue语句实例输出 【程序说明】 本程序的功能与例3-10相同,也是判断一个给定的整数是否是素数。程序第9~10 行,当n无法被i整除时,并不能说明该数一定是素数,因此需使用continue继续除下一 个数;程序第11~15行,当n能够被i整除时,说明该数一定不是素数,程序无须继续运 行,因此使用return语句直接退出方法。 【注意】 ● break的作用是终止循环,跳转到循环后的语句执行。 ● continue的作用是结束本次循环,继续下一次循环。 ● break除了用于循环语句,还用于switch语句,contniue只能用于循环语句。 .. 3.3 数 组 假设一个班级有60人,现在需要处理某个班级某门课程的成绩数据,例如,计算平均 分、最高分、分数标准差等,根据前面所学知识,需要定义60个变量来存储每位同学的课 程成绩,这不仅编写代码麻烦,而且一些操作难以实现。在Java中,可以使用一个数组来 存储60位同学的课程成绩。 3.3.1 Java数组简介 数组是具有相同类型的一组有序变量的集合,数组中的每个成员称为数组元素,简称 第3章 程序控制结构与数组 57 元素。关于数组,需说明的事项如下。 ● 数组可以存放各种类型的数据,但同一个数组里存放的元素类型必须一致。 ● 数组中元素的个数称为数组的大小,或数组长度。在Java中,可通过数组的 length属性获取数组长度,语法格式为“数组名.length”。 ● 数组中每个元素都有一个索引(也称下标),标明其在数组中的位置,要想访问数组 中的元素可以通过“数组名[下标]”的方式。 ● 数组下标从0开始,最大的下标值是“数组长度-1”,访问数组元素时,下标值应在 [0,数组长度-1]中,否则会报“ArrayIndexOutOfBoundsException”异常。 根据访问数组元素需要的下标的个数,数组可分为一维数组、二维数组和多维数组, 本书介绍一维数组和二维数组。 3.3.2 一维数组 一维数组是指由相同类型元素组成的线性集合,只需使用一个下标就可以访问数组 元素。 1.数组的定义 在Java中,定义数组的常用方式有3种,其语法格式如下。 方式一:动态初始化,其语法格式如下。 数据类型[]数组名= new 数据类型[数组长度]; 或 数据类型数组名[]= new 数据类型[数组长度]; 方式二:静态初始化,其语法格式如下。 数据类型[]数组名= new 数据类型[]{元素0, 元素1, 元素2, …}; 或 数据类型数组名[]= new 数据类型[]{元素0, 元素1, 元素2, …}; 方式三:静态初始化,其语法格式如下。 数据类型[]数组名= {元素0, 元素1, 元素2, …}; 或 数据类型数组名[]= {元素0, 元素1, 元素2, …}; 58 Java程序设计(微课版) 其中,数据类型与变量的数据类型一样,数组名即变量名,数组长度表示数组可存放 数组元素的个数,元素0、元素1等表示数组中存放的具体数据。 【注意】 ● Java用于声明数组的[]既可在数组名前面,也可放在数组名后面,如intarr[]和 int[]arr都是合法的。 ● Java在声明数组时,在[]中不可填入常量表示数组的长度,如intarr[10]这样的声 明在Java中是不允许的。 ● 若采用方式一定义数组,即不给数组元素进行初始化,则数组中元素的初值为各种 数据类型的默认初始值。 注:byte、short、int、long型元素默认初值为0,float、double型元素默认初值为0.0, char型元素默认初值为空字符,即\' u0000',boolean型元素默认初值为false,引用数据类 型默认初值为null。 下面是一些数组定义示例。 int[]a = new int[60]; double scores[]= new double[]{9.8, 9.6, 9.0, 8.6, 9.4}; String[]names = {"alex", "bob", "lily"}; 方式一定义了int类型数组变量a,并使用关键字new申请了连续60个int型存储单 元,分别是a[0]、a[1]、…、a[59],数组中元素没有初始化,默认初始值均为0。方式二和 方式三定义数组的同时,通过{}完成初始化赋值,这称为静态初始化。 2.数组的操作 定义数组后,可对其进行各种操作,常见操作包括数组元素赋值、数组遍历、数组求最 值、数组排序等。 ex3_12 【例3-12】 数组遍历实例。 0001 public class Example3_12 0002 { 0003 public static void main(String[]args) 0004 { 0005 int[]arr = {1, 3, 5, 7, 9}; 0006 arr[2]= 20; 0007 System.out.println("【遍历数组元素】"); 0008 for(int i = 0; i < arr.length; i++) 0009 System.out.println("arr[" + i + "]=" + arr[i]); 0010 } 0011 } 【运行结果】 程序运行结果如图3.18所示。 第3章 程序控制结构与数组 59 图3.18 数组遍历实例输出 【程序说明】 本程序的功能是演示数组元素赋值、数组遍历。程序第5行定义了整型一维数组,并 进行了静态初始化;程序第7行给数组元素arr[2]重新赋值为20;程序第9行通过for循 环操作一维数组,实现数组遍历,在遍历过程中输出了数组元素的值。 ex3_13 【例3-13】 数组求最值实例。 0001 public class Example3_13 0002 { 0003 public static void main(String[]args) 0004 { 0005 int[]arr = {1, 3, 20, 7, 9, 30, 10}; 0006 int max = arr[0]; 0007 for(int i = 1; i < arr.length; i++) 0008 { 0009 if(arr[i]> max) 0010 max = arr[i]; 0011 } 0012 System.out.println("数组的最大值为: " + max); 0013 } 0014 } 【运行结果】 程序运行结果如图3.19所示。 图3.19 数组求最值实例输出 【程序说明】 本程序使用“擂台法”求数组元素的最值,以求最大值为例。程序第6行设置擂台变 量max,用于保存最大值,并初始化其为数组第一个元素a[0]的值;程序第7~11行遍历 60 Java程序设计(微课版) 数组,将数组元素依次与擂台变量进行比较,如果数组元素的值大于擂台变量的值,则更 新擂台变量的值,遍历数组结束后,擂台变量max便保存了数组元素的最大值。 ex3_14 【例3-14】 数组排序实例。 0001 public class Example3_14 0002 { 0003 public static void main(String[]args) 0004 { 0005 int[]a = {1, 3, 20, 7, 9, 30, 10}; 0006 int n = a.length; 0007 for(int i = 1; i < n; i++) 0008 { 0009 for(int j = 0; j < n - i; j++) 0010 { 0011 if(a[j]> a[j+1]) 0012 { 0013 int t = a[j]; 0014 a[j]= a[j+1]; 0015 a[j+1]= t; 0016 } 0017 } 0018 } 0019 System.out.println("【数组排序后,结果为】"); 0020 for(int i = 0; i < n; i++) 0021 System.out.print(a[i]+ " "); 0022 } 0023 } 【运行结果】 程序运行结果如图3.20所示。 图3.20 数组排序实例输出 【程序说明】 本程序的功能是对数组进行非降序排序,使用冒泡排序法。冒泡排序是基于交换的 排序,排序思想是相邻元素两两比较,如果不满足小数在前、大数在后,则进行交换,这样 经过一趟排序后,最大的元素会被交换至数组最后位置。 假设数组有n个元素,冒泡排序通过二重for循环实现。程序第7行代码是外循环, 表示n个数共进行n-1趟排序,每趟排序会产生一个最大的值并交换至无序部分的末 第3章 程序控制结构与数组 61 尾,所以n个数需要n-1趟排序;程序第9行代码是内循环,表示第i趟排序的过程,对 数组元素a[0]、a[1]、…、a[n-i]进行排序,其方法是遍历此部分数组元素,并比较相邻数 组元素,如果大数在前、小数在后则交换二者。 此外,读者可以进一步对上述冒泡排序过程进行改进,例如在某一趟排序后,数组已 经有序,则没有必要再进行余下的几趟排序了,提升算法的性能。 3.3.3 二维数组 假设现在需处理某个班级多门课程的成绩数据,每位同学都有多门课程,该如何实现 呢? 这就需要二维数组,二维数组可以简单地理解为一维数组的数组。 二维数组的定义有3种主要方式。 方式一:直接分配数组每一维空间,其语法格式如下。 数据类型[][]数组名= new 数据类型[数组行数][数组列数]; 或 数据类型数组名[][]= new 数据类型[数组行数][数组列数]; 方式二:从数组最高维起,分别为每一维分配空间,其语法格式如下。 第一步:指定二维数组的行数。 数据类型[][]数组名= new 数据类型[数组行数][]; 或 数据类型数组名[][]= new 数据类型[数组行数][]; 第二步:分别指定数组每行的列数。 数组名[0]= new 数据类型[数组列数0]; 数组名[1]= new 数组类型[数组列数1]; …数 组名[数组行数-1]= new 数组类型[数组列数-1]; 方式二先动态创建数组第一维(即二维数组的行),然后依次为第一维的每个元素分 配空间(即每行的列数)。这种方式申请的二维数组的每行列数可不必相同。 方式三:静态初始化,其语法格式如下。 数据类型[][]数组名= {{元素00, 元素01, 元素02, …}, {元素10, 元素11, 元素12}, …, {元素n0, 元素n1, 元素n2, …}}; 或