6、控制结构
6.1 概念
用于控制程序运行
6.2 分类
主要分为顺序结构、分支结构和循环结构
6.2.1 顺序结构
用最常用、最基本的语句结构,从上到下、从左到右执行程序。
6.2.2 分支结构
1、if else 判断语句
格式一:
if(判断条件){//注意:判断条件必须是boolean类型的
当判断条件成立时,要执行的代码块;
}
int i = 2;
if (i > 0){
System.out.println(i + "大于0");
}
格式二:
if(判断条件){
当判断条件成立时,要执行的代码块;
}else{
当判断条件不成立时,要执行的代码块;
}
int i = 2;
if (i > 0){
System.out.println(i + "大于0");
}else {
System.out.println(i + "小于等于0");
}
格式三:
if(判断条件1){
当判断条件1成立时,要执行的代码块;
}else if(判断条件2){
当判断条件1不成立,且判断条件2成立时,要执行的代码块;
}else if(判断条件3){
当判断条件1、2都不成立,且判断条件3成立时,要执行的代码块;
}
……
}else{
当上述所有判断条件都不成立时,要执行的代码块;
}
int i = -1;
if (i > 0){
System.out.println(i + "大于0");
}else if (i == 0){
System.out.println(i + "等于0");
}else {
System.out.println(i + "小于0");
}
2、switch case选择语句
格式:
switch(值){
case 值1:
当值和值1匹配时,要执行的代码块;
break;
case 值2:
当值和值2匹配时,要执行的代码块;
break;
……
case 值n:
当值和值n匹配时,要执行的代码块;
break;
default:
当值和所有case后的值都不匹配时,要执行的代码块;
}
int n = 0 ;
switch (n){
case 0:
System.out.println("n的值为0");
break;
case 1:
System.out.println("n的值为1");
break;
default:
System.out.println("n的值不在规定范围内!");
}
运行结果:
n的值为0
注意:
(1)switch和case都是关键字;
(2)switch支持匹配的值的类型是有限制的:可以是byte、short、int、char、JDK1.7及其之后支持String类型;
(3)case穿透:即当值和某个case匹配成功时,执行了当前case的代码块,还将之后的所有代码块都执行了,如下代码所示:
int n = 0 ;
switch (n){
case 0:
System.out.println("n的值为0");
case 1:
System.out.println("n的值为1");
default:
System.out.println("n的值不在规定范围内!");
}
运行结果:
n的值为0
n的值为1
n的值不在规定范围内!
因为缺少break;语句,导致一直执行case里面的代码块。break语句的作用是一旦执行了将结束整个switch case语句。
6.2.3 循环结构
循环四要素:初始化条件语句、循环条件、循环体、改变循环条件的语句。
1、while循环
格式:
初始化条件语句;//用来定义一个循环变量
while(循环条件){ //使用循环变量构建一个结果为布尔值的表达式
循环体; //每次循环都要执行的代码块
改变循环条件的语句; //改变循环条件,从而实现在某个点来结束循环
}
执行流程:
情况一:初始化条件语句—>循环条件—>循环条件为true,则执行循环体—>改变循环条件的语句—>重新回到while循环条件继续循环;
情况二:初始化条件语句—>循环条件—>循环条件为false,则结束循环。
应用场景:
如果不确定循环的次数,则适合使用while循环。
2、do while循环
格式:
初始化条件语句;
do{
循环体;
改变循环条件的语句;
}while(循环条件);
执行流程:
情况一:初始化条件语句—>循环条件—>改变循环条件的语句—>为true则执行循环体—>重新回到while的循环条件;
情况二:初始化条件语句—>循环条件—>改变循环条件的语句—>为false则循环结束。
应用场景:
如果在循环之前需要先执行一次循环体,则适合使用do while循环。
注意:while和do while的区别
while是先执行循环条件,do while无论是否符合循环条件都会循环一次;
3、for循环
格式:
for(初始化条件语句;循环条件;改变循环条件的语句){
循环体;
}
执行流程:
情况一:先执行初始化条件语句—>循环条件—>循环条件为true,则执行循环体—>改变循环条件语句—>重复循环条件……
情况二:先执行初始化条件语句—>循环条件—>循环条件为false,则循环结束。
应用场景:
如果确定循环次数,则适合使用for循环
4、关于循环变量的作用域
大括号“{}”表示范围,变量所属的大括号的范围就是变量的作用域(就近原则);
在循环中定义的变量仅能在循环中使用,属于局部变量,出去循环则无法使用;但在main方法中的定义的变量,既可以在main方法中使用,也可以在循环中使用;
在同一个作用域中变量名不能重复,但是不同循环/作用域中变量名可以一样。
5、死循环:无限循环,不能结束
(1)while( true ){ 循环体; }
while (true){
System.out.println("hello");
}//不会报错,无限循环
while (true){
System.out.println("hello");
}
System.out.println("world");//加上一条输出语句,则编译时会报错
//因为while是死循环,会一直执行,所以死循环下面的语句无法执行,所以编译时会报错
boolean flag = true;
while (flag){
System.out.println("hello");
}
System.out.println("world");
//该情况也不会报错,因为变量在编译时只能校验变量的数据类型,无法确定具体的值,所以该程序会一直循环执行“hello”,不会执行到“world”,但不会报错。
(2)for( ; ; ){循环体;}
for (;;){
System.out.println("hello");
}//死循环不会报错,会一直执行“hello”
for (;;){
System.out.println("hello");
}
System.out.println("world");
//在死循环外,加上输出语句,编译时会报错
//因为该for循环在编译时可以确定它是死循环,所以可以判定“world”永远不会被输出,所以会报错
for (int num = 0 ;num < 10;){
System.out.println("hello");
}
System.out.println("world");
//给for循环加上“循环变量”和“判断条件”,但是不给for循环加“改变循环条件的语句”,也是一个死循环,但在循环外加上输出语句不会报错。因为在编译时不法确定该for循环为死循环,所以在循环外加上输出语句不会报错。
6、循环嵌套
格式:(以for循环为例)
for(初始化条件语句1;循环条件1;改变循环条件的语句1){
for(初始化条件语句2;循环条件2;改变循环条件的语句2){
循环体;
}
}
内层循环可以看作外层循环的循环体,只有在内层循环执行完之后,才会执行外层循环改变循环条件的语句。
7、循环的跳转语句
(1)break;
用于循环中,执行到break语句后,直接结束整个循环。
for (int i = 0; i < 5 ; i++) {
if (i == 2){
break;
}
System.out.println("hello" + i);
}
运行结果:
hello0
hello1
此外break语句还可以在switch case结构中使用;其次break语句不可以单独在if语句中使用,必须在循环中嵌套使用。
(2)continue;
用于循环中,执行到continue语句后,跳出当次循环,继续下一次循环。
for (int i = 0; i < 5 ; i++) {
if (i == 2){
continue;
}
System.out.println("hello" + i);
}
运行结果:
hello0
hello1
hello3
hello4
(3)return
是用于结束方法的关键字。
8、在循环嵌套中使用break
(1)在循环嵌套中,break和continue默认作用于他所属的离它最近的循环
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3 ; j++) {
if (j == 2){
break;
}
System.out.println("i=" + i + ",j=" + j);
}
}
运行结果:
i=0,j=0
i=0,j=1
i=1,j=0
i=1,j=1
i=2,j=0
i=2,j=1
(2)可以给循环起名字,通过break跳出指定的循环
Outer:for (int i = 0; i < 3; i++) {
Inner:for (int j = 0; j < 3 ; j++) {
if (j == 2){
break Outer;
}
System.out.println("i=" + i + ",j=" + j);
}
}
运行结果:
i=0,j=0
i=0,j=1