流程控制
顺序结构
按代码顺序从上至下执行(不存在分支、选择、循环结构时的默认结构)
分支结构 if
单if结构
if(条件){
语句}
条件满足-语句执行
条件不满足-语句不执行
标准if…else结构
if(条件){
语句1}
else{
语句2}
条件满足-执行语句1
条件不满足-执行语句2
一定会执行一个语句
多种条件结构if…else if…else
if(条件1){
语句1}
else if(条件2){
语句2}
else if(条件3){
语句3}
...
else{
语句n}
- 一定会执行一个语句
- 依次判断每一个条件,当有一个条件满足时,执行条件下面对应的一条语句(后面的其他条件不再判断,语句不再执行)
- 任何条件都不满足时执行语句n
- 注意确保条件间的互斥!!!
int age=46;
if(age<18){
System.out.println("未成年");
}else if (age<24) {
System.out.println("青年");
}else if (age<35) {
System.out.println("青壮年");
}else if (age<50) {
System.out.println("中年");
}else if (age<65) {
System.out.println("中老年");
}else {
System.out.println("老年");
}
//输出 中年;
嵌套if…else…
-
任意组合if 与 if…else 与 if…else if…else
-
不可以单纯出现else,if else之间不能出现代码段!
if(条件1:一般为先决条件){ if(条件2){ 语句1 }else if(条件3){ 语句2 }else{ 语句3 } }else{ 语句4:一般为先决条件的错误提示 }
选择结构 switch…case
-
计算表达式的结果,将结果按顺序依次与case后的值比较,相等时执行对应语句并跳出switch(其他语句不再执行);没有任何一个相等时执行default对应语句并跳出switch;
-
switch后面的表达式
表达式结果只能是 byte、short、int、char、 枚举类型、String 类型;Boolean、long、float、double、语句都不可以!!! -
case
case后的值不能重复;case后的值的类型必须=表达式结果的类型(以便判断是否相等) -
default
default 语句的位置不影响switch语句内的执行顺序,即即便把default放到最前面,也会在最后(没有任一case后值=表达式结果值时)进行判断;switch(表达式){ case 值1: 语句1; break;//(可省略) case 值2: 语句2; break; //(可省略) case 值3: 语句3; break;//(可省略) ... default://(可省略) 语句n; break;//(可省略) }
-
break
当发现表达式结果=case后的值时,所有的case失效,相当于直接 从符合情况的case后面的语句开始执行,到发现break为止跳出switch ,没有break的话执行语句具有穿透性,即全部执行完跳出switch;
如下案例:利用switch的穿透性计算输入的日期在今年是第几天!
//思路:倒叙写月份,以便向前(向下)不停加总天数;(如果正序写,会从当前月份往后加,就错了)
import java.util.Scanner;
public class Test6 {
public static void main(String[] args) {
System.out.println("请输入月份");
Scanner scanner=new Scanner(System.in);
int month =scanner.nextInt();
System.out.println("请输入日期");
Scanner scanner2=new Scanner(System.in);
int day =scanner2.nextInt();
int sum=0;
switch (month) {
case 12:
sum=sum+30;
case 11:
sum=sum+31;
case 10:
sum=sum+30;
case 9:
sum=sum+31;
case 8:
sum=sum+31;
case 7:
sum=sum+30;
case 6:
sum=sum+31;
case 5:
sum=sum+30;
case 4:
sum=sum+31;
case 3:
sum=sum+28;
case 2:
sum=sum+31;
case 1:
sum=sum+day;
}
System.out.println(sum);
}
}
案例2:
//语句2-语句n全都会执行
switch(表达式结果为值2){
case 值1:
语句1;
case 值2:
语句2;
case 值3:
语句3;
...
default:
语句n;
}
案例3:
//语句1到语句4都会被执行
switch(表达式结果为值1){
case 值1:
语句1;
case 值2:
语句2;
case 值3:
语句3;
case 值4:
语句4;
break;
case 值5:
语句5;
...
default:
语句n;
}
循环结构 for;while;do…while;
while
四要素
初始值 (用于循环条件的判断)
从什么情况开始做?
初始值满足循环条件则最优先执行且仅执行一次
循环条件
什么情况下一直做?
判断条件是否满足,满足则执行循环体,执行完毕后再执行循环,直到条件不满足,结束循环。
循环体
一直做什么?
控制计数器
现在进行到什么情况了?
如果控制计数器只是个计数器,与要执行的语句没有关系的话,初始值和计数器计数方式不限,只要保证对循环次数控制的效果即可!
如果计数器与打印结果有关,务必注意初始值、循环条件和计数器位置的设置~!(初始从0还是从1开始、循环条件是否含等号、计数器放在执行前还是后)
//while打印10个星号*
int i =1;//初始值 从准备打印第一个开始
while(i<=10){ //循环条件 到 准备打印第十个 都一直打印
System.out.println("*");//循环体 打印星号
i++;//控制计数器 已经打印了1个,准备打印第二个
}
//for打印10个星号*
for(int i =1;i<=10;i++){ //初始值;循环条件;控制计数器
System.out.println("*");//循环体
}
- break
与选择语句中类似,遇到break,跳出整个循环
break往往可能在循环中的嵌套语句(条件)内,但跳出是跳出整个循环,而不是跳出break所在的大括号 - continue
从当前语句直接跳到循环的开始(跳过当前这一次的后面部分);
一般用于跳过某些情况,如不及格的成绩
//利用continue实现跳过5,打印1-10
public class Test5 {
public static void main(String[] args) {
int i=0;
while(i<10){
i++;
/*if(i==5){
continue;
}
System.out.println(i);*/
if(i!=5){
System.out.println(i);
}else{
continue;
}
}
}
}
do…while
初始化;
do{
执行语句功能
控制计数器
}while(循环条件);
执行语句功能一定会被执行一次!若初始值不满足循环条件,也会执行,可能造成逻辑错误! 不推荐使用
for
for(初始化;循环条件;控制计数器){
执行语句功能;
}
- 计数器的声明和初始化如果都在for的()内,则其作用域仅在for循环内;如果for外面需要用到,则应在for外定义。如果for循环外面用不到,建议在里面定义,可以及时被释放掉,节约内存
对比for和while
for循环常用场景:能够知道循环次数时;
while循环常用场景:网络编程(信息交互)、I/O流(文件存读)、数据库、其他情况下无法知道循环次数时
死循环
==死循环后面的语句是无法被执行的(编译都会报错),如果死循环后要写语句,这个死循环必须有跳出动作 (break,return,system.exit(0) ) ==
-
for( ; ; ) { }
循环条件置空即可,初始值和计数器可置空可以不置空 -
while (true) { }
-
do { } while (true) ;
使用场景:当无法确认循环条件的临界点,只有执行过程中才能判断时,使用死循环,然后在循环内做判断并break;
//输出每一个字符,直到遇到第一个数字时停止
public static void main(String[] args) {
String s="ABCabc123@#$";
for(int i=0;;i++){
char c=s.charAt(i);
if(c>='0'&&c<='9'){
break;
}
System.out.print(c);
}
}
循环嵌套
public static void main(String[] args) {
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
System.out.print("* ");
}
System.out.println("");
}
}