【Java】java控制语句的那些事(最全知识点)

【Java】java控制的那些事(最全知识点)

学习一门语言,最基础的不过控制语句,语言之间互通性最高的也是控制语句,如果你连控制语句都没搞懂,都不熟悉,那么你的编程之路注定不顺利,所以奔本篇详细介绍了控制语句的各类知识点

流程控制语句

流程控制语句分类:

  1. 顺序结构
  2. 选择结构
  3. 循环结构

顺序结构

  • 顺序结构是最基本的流程
  • 顺序结构的特点: 从上往下依次进行

选择结构

if语句

if语句第一种格式的基本使用

  • 选择结构:

    • 也被称为分支结构
  • 选择结构有2种:

    1. if语句
    2. switch语句
  • if语句的第一种格式: 只使用if

// 格式
if(关系表达式) {
	语句体
}

// 示例
int a = 0;
if(a == 1) {
	System.out.println("a等于1");
}
  • 第一种格式的执行流程:
    • 首先判断关系表达式的结果是true还是false
      • 如果是true就执行语句体
      • 如果是false就不执行语句体

if语句第二种格式的基本使用

  • if语句的第二种格式: if…else…
  • 第二种格式的执行流程:
  • 首先判断关系表达式看其结果是true还是false
    • 如果是true就执行语句体1
    • 如果是false就执行语句体2

if语句第三种格式的基本使用

  • if语句的第三种格式: if…else if…else
// 格式
if(关系表达式1) {
	语句体1
} else if (关系表达式2) {
	语句体2
}...{

} else {      // else {} 是可选的
	语句体n
}
  • 第三种格式的执行流程:
    • 首先判断关系表达式1, 看其结果是true还是false
      • 如果是true就执行语句体1
      • 如果是false就继续判断关系表达式2, 看其结果是true还是false
        • 如果是true就执行语句体2
        • 如果是false就继续判断关系表达式3, 看其结果是true还是false
      • 如果没有任何关系表达式为true, 就执行else中的语句体
  • 能不能省略最后的else? 可以

switch语句的格式和执行流程

  • switch语句的格式
switch(表达式) {
	case1:
		语句体1;
		break;
	case2:
		语句体2;
		break;
	...
	case 值n:
		语句体n;
		break;
	default:
		语句体n+1;
		break;
}
  • 说明
    • switch表达式允许的数据类型:
      • byte, short, char, int
        • 都是可隐式转换为int的类型, 因为byte, short, char可以隐式转换为int, 所以也可以使用
      • JDK5起可以是枚举类型
      • JDK7起可以是String
      • 小括号中可以是常量, 也可以是变量
    • case后面的值:
      • 用来和表达式的值进行匹配
      • 值只能是常量
      • 值的类型应该和switch小括号中值的类型一致
    • break: 中断
    • default: 当所有case都不匹配时, 执行default
  • 执行流程
    • 首先计算表达式的值
    • 然后执行符合的case
    • 如果没有符合的case, 则执行default

循环控制语句

  • 循环语句: 在满足循环条件的情况下, 反复执行某段代码.
    • 循环体: 这段被重复执行的代码
  • 循环的停止:
    • 在合适的时候将循环判断条件修改为false, 从而结束循环. 否则循环将一直执行下去, 形成死循环
  • 循环语句的组成
    • 初始化语句: 一条语句(一条语句可以初始化多个变量), 这些语句完成一些初始化操作
    • 判断条件语句: boolean表达式, 这个表达式能决定是否执行循环体
    • 循环体语句: 要重复做的事情
    • 控制条件语句: 控制循环结束
  • 3种循环结构语句
    1. for循环
    2. while循环
    3. do…while循环

for循环

  • 格式
// 格式
for(初始化语句; 判断条件语句; 控制条件语句) {
	循环体语句;
}
// for循环适用于知道循环多少次的情况
// 示例
for (int i = 1; i <= 5; i++) {
	System.out.println("我错了");
	syso(i); 
}
  • 执行流程
    1. 先执行初始化语句
    2. 然后执行判断条件语句
      • 如果为true, 则执行循环体语句
        • 循环体语句执行完毕后, 执行控制条件语句
        • 从步骤2重复
      • 如果为false, 则for循环结束
  • 初始化语句只能有一句吗?
    • 只能有一句
    • 但注意, 一句可以初始化多个变量: int i = 0, j = 1, k = 1;
// 初始化多个变量来控制循环的情况
for(int i = 0, j = 10; i < 10 && j > 5; i++, j--) {
	System.out.println(i + ", " + j);
}

// 输出结果
i=0, j=10
i=1, j=9
i=2, j=8
i=3, j=7
i=4, j=6
  • 注意: 初始化语句在循环中只执行一次

while循环格式和基本使用

  • while循环的格式:
// while普通格式
while(判断条件语句) {
    循环体语句;
}

// 普通格式示例
while(i < 100) {
    syso(i);
}

-----

// while扩展版格式
初始化语句;
while(判断条件语句) {
    循环体语句;
    控制条件语句;
}

// 扩展版示例
int i = 0;
while(i < 100) {
    syso(i);
    i++;
}
  • while循环的执行流程:
    • 先执行关系表达式
      • 如果关系表达式为true, 则执行循环体
        • 循环体执行完后, 继续执行关系表达式
      • 如果关系表达式为false, 则循环结束
  • while循环和for循环的相互转换:
// while
int i = 0;
while(i < 100) {
    syso(i);
    i++;
}

// for
for(int i = 0; i < 100; i++) {
    syso(i);
}

do…while循环格式及基本使用

  • 语句格式:
// 普通格式
do {
    循环体语句;
} while(判断条件语句);

// 扩展格式:
初始化语句;
do {
    循环体语句;
    控制条件语句;
} while(判断条件语句);
  • 执行流程:
    1. 执行初始化语句
    2. 执行循环体语句
    3. 执行控制条件语句
    4. 执行判断条件语句, 看是true还是false
      • 如果是false, 则结束循环
      • 如果是true, 回到2继续执行循环体语句

for, while, do…while三种循环的区别

  • 区别

    • do…while: 至少执行一次循环体
    • for, while: 必须判断条件成立, 才可以执行循环体
  • for循环的初始化语句的作用域: for的大括号内

  • 思考:

    • for的初始化表达式能否定义在for循环外? 可以, 定义在for循环前
    • for循环的()之内的三个表达式能否有多条? 可以

控制循环语句

  • 2个控制循环语句:
    • break: 直接结束循环, 或switch语句
    • continue: 结束本次循环, 继续执行下一次

break跳转控制语句的概述和基本使用

  • break的使用场景: 不能单独使用, 必须用于switch或循环中
  • break的作用:
    1. 在switch语句中, 用于结束case
    2. 在循环中, 用于结束所在的循环

continue跳转控制语句

  • continue的使用场景: 循环中
  • continue的作用: 结束本次循环, 继续下一次的循环

控制跳转语句分析


扩展

  • switch语句的case穿透
    • 如果switch的case语句中没有break, 则会继续执行下一个case的代码, 这称为case穿透
    • case穿透有时会导致代码出现问题, 但有时我们也利用case穿透简化代码
int a = 2;
switch (a) {
	case 1:
		System.out.println("进入1");
		break;
	case 2:
		System.out.println("进入2");
	case 3:
		System.out.println("进入3");
		break;
}

会输出:
进入2
进入3
  • if语句不写大括号的格式
    • 当if语句不写大括号时, 只有if语句后的第一条语句算作if语句的语句体, 其余不算
// 示例
if (false) {
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句不会被执行");
} 

// 去掉大括号后
if (false) 
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句会被执行");

// 相当于
if (false) {
	System.out.println("这条语句不会被执行");
}
System.out.println("这条语句会被执行");
  • while语句, for语句不写大括号的格式
    • 当语句不写大括号时, 只有语句后的第一条语句算作语句的语句体, 其余不算
// 示例
while (false) {
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句不会被执行");
}

// 去掉大括号后
while (false) 
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句会被执行, 且只执行1次");

// 相当于
while (false) {
	System.out.println("这条语句不会被执行");
}
System.out.println("这条语句会被执行, 且只执行1次");


//------------------


// for示例
for (int i = 0; i < 1; i++) {
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句不会被执行");
}

// 去掉大括号后
for (int i = 0; i < 1; i++) 
	System.out.println("这条语句不会被执行");
	System.out.println("这条语句会被执行, 且只执行1次");

// 相当于
for (int i = 0; i < 1; i++) {
	System.out.println("这条语句不会被执行");
}
System.out.println("这条语句会被执行, 且只执行1次");
  • for循环哪些语句可以省略:
    • 如果变量在for循环外已经声明, 则初始化语句可以省略
    • 判断条件语句可以省略, 相当于不停止
    • 控制条件语句可以省略, 相当于不改变for循环中的变量
// 外部声明的变量, 作用域如果包含了for循环, 也是可以在for循环中直接使用的
int i = 0;
for (; i < 10; i++) {
	// ...
}

// 将for循环修改为死循环
for (;;) {
	// 死循环
}

for (;;);  // 连循环体都没有的死循环
// while也可以死循环
while (true) {
	// 死循环
}

while (true);  // 没有循环体的死循环

总结

  • 流程控制语句
    • 顺序结构
    • 选择结构: 用于根据不同条件执行不同的代码
      • if语句
        • 3种格式
        • else…if, else语句可以省略
      • switch语句
        • case穿透
        • switch表达式允许的数据类型:
          • byte, short, char, int
            • 都是可隐式转换为int的类型, 因为byte, short, char可以隐式转换为int, 所以也可以使用
          • JDK5起可以是枚举类型
          • JDK7起可以是String
          • 小括号中可以是常量, 也可以是变量
        • case后面的值:
          • 用来和表达式的值进行匹配
          • 值只能是常量
          • 值的类型应该和switch小括号中值的类型一致
        • break: 中断
        • default: 当所有case都不匹配时, 执行default
      • if语句适用于有范围的场景, 或者具体值的场景
      • switch语句适用于具体值场景, 不适用于范围的场景
    • 循环结构: 用于在满足循环条件的情况下, 重复执行某些代码
      • for循环
        • 适用于知道循环次数的场景
      • while循环
        • 适用于不知道循环次数的场景
        • 至少执行0次循环体
      • do…while循环
        • 适用于不知道循环次数的场景
        • 至少执行1次循环体
      • 循环控制语句: 控制循环的跳过或结束
        • break
          • 适用场景: switch语句, 循环
          • 作用: 结束switch语句或所在循环
        • continue
          • 适用场景: 循环
          • 作用: 结束本次循环, 继续下次循环

if语句格式

// 格式1
if (关系表达式) {
	语句体;   // 关系表达式为true时执行
}

// 格式2
if (关系表达式) {
	语句体1;   // 关系表达式为true时执行
} else {
	语句体2;   // 关系表达式为false时执行
}

// 格式3
if (关系表达式1) {
	语句体1;   // 关系表达式1为true时执行
} else if (关系表达式2) {
	语句体2;   // 关系表达式2为true时执行
}
...
} else {
	语句体n;   // 以上关系表达式都为false时执行
}

switch语句的格式

// 格式
switch (表达式) {
	case1:    // 当表达式的值为值1时执行
		语句体1;
		break;
	case2:    // 当表达式的值为值2时执行
		语句体2;
		break;
	...
	default:    // 当表达式的值不能匹配上面的case时执行
		语句体n;
		break;
} 

for循环格式

// 格式
for (初始化语句; 判断条件语句; 控制条件语句) {
	循环体语句;
}

// 示例
for (int i = 1; i <= 5; i++) {
	// 获取1~5的数值
}

while循环格式

// 普通格式
while (判断条件语句) {
	循环体语句;
}

// 扩展格式
初始化语句;
while (判断条件语句) {
	循环体语句;
	控制条件语句;
}

// 示例
int i = 1;
while (i <= 5) {
	syso(i);  // 打印1~5
	i++;
}

do…while格式

// 普通格式
do {
	循环体语句;
} while (判断条件语句);


// 扩展格式
初始化语句;
do {
	循环体语句;
	控制条件语句;
} while (判断条件语句);

// 示例
int i = 1;
do {
	syso(i);
	i++;
} while (i <= 5);

往期知识:Java运算符那些事(最全知识点)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章