1、顺序结构
编程语言中最常见的结构就是顺序结构。顺序结构就是程序从上到下逐行的执行,中间没有任何跳转和判断。
如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码先执行。这意味着:如果没有流程控制,Java方法里的语句是一个顺序执行流,从上向下依次执行每条语句。
2、分支语句
Java提供了两种常见的分支控制结构:if语句和switch语句,其中if语句使用布尔表达式或布尔值作为分支条件来进行分支控制;而switch语句则用于对多个整数值进行匹配,从而实现分支控制。
2.1 if条件语句
if语句使用布尔表达式或布尔值作为分支条件来进行分支控制。if语句有如下三种形式。
第一种形式:
if (logic expression){
statement...
}
第二种形式:
if (logic expression){
statement...
}else{
statement...
}
第三种形式:
if (logic expression){
statement...
}else if (logic expression){
statement...
//可以有零个或多个else if语句
...
//最后的else语句也可以省略
else{
statement...
}
在上面的if语句的三种形式中,放在if之后括号里的只能是一个逻辑表达式,即这个表达式的返回值只能是true或false。第二种形式和第三种形式是相通的,如果第三种形式中else if块不出现,就变成了第二种形式。
在上边的条件语句中,if (logic expression)、else if (logic expression)和else后花括号括起来的多行代码被称为代码块,一个代码块通常被当成一个整体来执行(除非运行过程中遇到return、break、continue等关键字,或者遇到异常),因此这个代码块也被称为条件执行体。
当条件执行体只有一行语句时,则可以省略花括号,因为单行语句本身就是一个整体,无需用花括号来把他们定义成一个整体。但是,通常建议不要省略if、else、else if执行体后面的花括号,即使条件执行体只有一行代码,也保留花括号会有更好的可读性,而且保留花括号会减少发生错误的可能。例如如下代码:
int b = 6;
if (b > 3)
//如果b大于3,则执行下面的执行体,只有一行代码作为代码块
System.out.println("b大于3");
else
//否则,执行下面的执行体,只有一行代码作为代码块
b--;
//对于下面代码而言,他已经不再是条件执行体的一部分
//故总会执行
System.out.println("b不大于3");
2.2 switch分支语句
switch语句是一种比较简单明了的多选一的选择,在Java语言中,可以用switch语句将动作组织起来进行多选一。语法格式如下:
switch(表达式){
case 常量值1:
语句块1
break;
...
case 常量值n:
语句块2
break;
default:
语句块 n+1;
break;
}
switch语句中表达式的值必须是整型或字符型,常量值1~n必须也是整型或字符型。
switch语句是怎么执行的过程如下:首先switch语句先计算表达式的值,如果表达式的值与case后的常量值相同,则执行该case后的若干个语句,直到遇到break语句为止。如果没有break,则继续执行下一case中的若干语句,直到遇到break为止。若没有一个常量的值与表达式的值相同,则执行default后面的语句。default语句可选,如果不存在default语句,而且switch语句中的表达式的值与任何case的常量值都不相同,则switch不做任何处理。并且,同一个switch语句,case的常量值必须互不相同。
3、循环结构
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成死循环。
3.1 while循环语句
while循环的语法格式如下:
初始化语句;
while (循环条件){
循环体;
迭代语句;
}
while循环为每次执行循环体前,先对循环条件求值,若循环条件为true,则运行循环体部分。然后执行迭代语句。实例如下。
//循环的初始化条件
int count = 0;
//当count<10的时候,执行循环体
while (count < 10){
//循环体
System.out.println(count);
//迭代语句
count++;
}
System.out.println("循环结束");
3.2 do…while循环语句
do…while循环与while循环的区别在:while循环语句是先判断再执行,do…while是先执行再判断,哪怕循环条件得知一开始是假,也会执行循环体,因此do…while的循环体至少执行一次。
do…while循环语句的语法格式如下。
初始化语句;
do
{
循环体;
迭代语句;
}while (循环条件);
举例如下。
//循环的初始化条件
int count = 1;
do{
//循环体
System.out.println(count);
//迭代语句
count++;
//当count<10的时候,执行循环体
}while(count < 10);
System.out.println("循环结束");
3.3 for循环
for循环相比较while循环、do…while循环来说,更加简洁。
for循环的基本语法格式如下:
for (初始化语句:循环条件:迭代语句){
循环体;
}
举例如下。
//循环的初始化条件、循环条件、迭代语句都在一行
for (int count = 0 ; count < 10 ; count++){
System.out.println(count);
}
System.out.println("循环结束");
Java 5之后,Java提供了一种更为简单的循环:foreach循环,这种循环遍历数组和集合更加简洁。使用foreach循环遍历数组和集合元素时,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,foreach自动遍历数组和每个元素。
foreach语法格式如下。
for (循环变量类型 循环变量 : 数组名){
循环体;
}
举例如下。
int array[] = {1, 2, 3};
for (int arr : array) {
System.out.println(arr);
}
4、跳转语句
Java提供了3种跳转语句:break语句、continue语句、return语句。
4.1 使用break结束循环
break用于完全结束一个循环,跳出循环体。**注意是结束当前循环体。**举例如下。
for (int i = 0 ; i < 10 ; i++){
System.out.println("i的值是" + i);
if (i == 3){
//执行该语句时将结束循环
break;
break语句也可以直接结束其外层循环,但是此时需要在break后紧跟一个标签,这个标签用于标识一个外层循环。
Java中的标签就是紧跟着英文冒号(:)的标识符。Java中的标签都放在循环语句之前才有作用。如下代码。
//外层循环,outer作为标识符
outer:
for (int i = 0 ; i < 5 ; i++){
//内层循环
for (int j = 0 ; j < 3 ; j++){
System.out.println("i的值为" + i + "j的值为" + j);
if (j == 1){
//跳出outer标签所标识的循环
break;
}
}
注意:通常紧跟break之后的标签,必须在break所在循环的外层循环之前定义才有意义。
4.2 使用continue忽略本次循环剩下的语句
continue语句只能用于for、while、do···while循环语句中,用于让程序直接跳过其后面的语句,进行下一次循环。
for (int i = 0 ; i < 3 ; i++){
System.out.println("i的值为" + i);
if (i == 1){
//忽略本次循环的剩下语句
continue;
}
System.out.println("continue后的输出语句");
}
运行结果如下:
i的值为0
continue后的输出语句
i的值为1
i的值为2
continue后的输出语句
与break类似,continue后面也可以紧跟一个标签,用于直接跳过所标识的当次循环的剩下语句,重新开始下一次循环。标签具体用法与break相同。
4.3 使用return结束方法
return关键字的功能是结束一个方法。
public void getName() {
return name;
}
例如上方代码,这是一个方法用于获取姓名,当调用这个方法时将返回姓名值。
5、数组类型
所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。
数组本身也是一种引用数据类型。
5.1 一维数组
5.1.1 定义数组
定义Java数组的语法格式有如下两种:
type[] arrayName;
type arrayName[];
对这两种格式来说,通常推荐使用第一种。因为第一种有更好的语义,并且有更好的可读性。
5.1.2 数组的初始化
- Java语言中数组必须先开始初始化,然后才可以使用。数组的初始化有2种方式。
1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度。
2.动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值。 - 数组只有一个名称,即标识符
- 元素下标标明了元素在数组中的位置,从0开始。数组中的每个元素都可以通过下标来访问.举例:
int[] array = new int[]{1, 2, 3, 4, 5},则数组的元素为array[0]、array[1] 、array[2]、array[3]、array[4]
5.1.2.1 静态初始化
方式一:
//分配长度为4个int型的内存空间,并分别赋初始值1,2,3,4,5
int[] array = new int[]{1, 2, 3, 4, 5};
方式二:
//方式一的简写
int[] array = {1, 2, 3, 4,5};
5.1.2.2 动态初始化
//分配长度为5的内存空间,并全部赋为默认值 0
//相当于 int[] array = new int[5]{0, 0, 0, 0} 的简写
int[] array = new int[5];
指定初始值时的规则如下。
5.2 二维数组
Java 语言把二维数组看成是数组的数组,不同于 C/C++ 二维数组分配的是连续内存,Java 的高维数组分配的并非是连续内存,所以不要求二维数组的每一维的大小相同。
实质上,Java 高维数组还是一维数组,只不过这个一维数组的元素比较特殊,是由低一维的数组这种引用类型的引用构成的。
5.2.1 定义方式
方式一:
//即创建了一个 3*2 的二维数组,array 里有三个数组元素
//三个数组元素都是长度为 2 的一维数组的引用
int[][] array = new int[3][2];
方式二:
int[][] array = new int[3][];
//由于二维数组相当于是一维数组这种引用类型的引用组成的
//所以此时等价于 int[][] array = {null, null, null}
//下面可以为 array 数组分别赋上长度不同的一维数组
array[0] = new int[1];
array[1] = new int[2];
array[2] = new int[3];
方式三:
int[][] array = {{1, 2}, {1, 2, 3}, {2}};