流程控制
Java 程序的执行通常分为三种方式:顺序执行、选择执行和循环执行。
顺序结构
程序代码按照从上到下的顺序逐行执行,代码中的每一行都会依赖前一行的执行结果。
选择结构
if选择结构
- 如果
 if语句只执行一条语句,可以省略{};但为了提高代码的可读性,建议始终使用{}包围代码块,尤其是当有多条语句需要执行时。{}中的代码块限定了其中定义的变量或常量的作用域,这些变量只能在该代码块内部访问,外部无法使用。- 若条件选择较多,使用
 if-else或switch结构可以提高效率,而不仅仅依赖多个if语句。if语句内部可以嵌套其他选择结构(如if-else)或循环结构(如for、while)来处理复杂的逻辑。
switch选择结构
switch语句根据表达式的值跳转到匹配的case标签处执行,直到遇到break语句或switch语句末尾。如果没有匹配的case值,则进入default语句(如果有的话)。switch()中的表达式类型必须为:byte、short、int、char、String(JDK 7 及以后)、枚举类型(JDK 1.5 及以后)和密封类(JDK 17 及以后)。switch不直接支持包装类(如Byte、Short、Integer、Character),但可以通过自动拆箱机制间接支持。switch()不支持long:因为其范围过大,不适合用作switch的条件。switch()不支持float和double:由于浮点数的精度问题,不适合用于精确匹配。switch()不支持boolean:只有两个值(true和false),直接使用if-else更合适。case后的值必须是常量,且常量类型要与switch()中的表达式类型匹配,并且不允许有重复的case值。break用于跳出switch语句;可以省略break,但若省略,程序会继续执行后面的case语句,直到遇到break或switch语句的结束。default语句是可选的,但最好不要省略,除非所有case都能覆盖所有可能的值。case和default的位置无序,但default语句通常放在最后。public class Main { public static void main(String[] args) { int day = 3; switch (day) { case 1: System.out.println("今天是星期一"); break; case 2: System.out.println("今天是星期二"); break; case 3: System.out.println("今天是星期三"); // 没有 break,会继续执行下面的 case case 4: System.out.println("今天可能是星期三或星期四"); break; case 5: System.out.println("今天是星期五"); break; default: System.out.println("不是有效的星期值"); } } }
switch和if的区别
switch:适用于判断固定值时,特别是当需要对多个常量值进行匹配时。if:适用于判断区间、范围或布尔类型的表达式。switch能做的事,if也能做,但反之不成立(例如,switch不能直接判断区间或布尔值)。
循环结构
for循环结构
初始化表达式仅在循环开始时执行一次;每次迭代前都会检查循环条件,循环体执行完后更新循环变量。
while循环结构
while循环与for循环类似,在每次迭代前先检查循环条件,条件为true时才执行循环体。语法灵活,适合循环次数不确定的情况。
do-while循环结构
先执行一次循环体,再检查循环条件,保证循环体至少执行一次。
break和continue详解
break关键字
break用于强制退出当前循环或switch语句,不再执行其余的代码块。- 它适用于
 switch语句和循环结构中,作用于for循环时,for后的更新表达式也不会被执行。- ⚠️ 注意:
 break之后不能有其他代码,因为一旦执行了break,当前循环或switch会终止,后续代码无法执行。
continue关键字
continue用于跳过当前循环的剩余语句,立即进行下一次循环条件的判断。- 它只适用于循环结构中,不可在其他控制流语句中使用。
 
带标签的break和continue
在多层嵌套循环中,普通的
break和continue只能作用于最近的一层循环。Java 允许为循环语句加上标签,从而让break或continue直接作用于指定的外层循环。
break label:直接终止带该标签的循环。continue label:跳过带该标签循环的当前迭代,进入下一次循环。public class LabelDemo { public static void main(String[] args) { outer: // 标签 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (j == 1) continue outer; // 跳过外层循环的当前迭代 if (i == 2) break outer; // 直接结束外层循环 System.out.println("i=" + i + ", j=" + j); } } } }💬 关于
goto
- 在 早期的 C/C++ 语言中,
 goto语句允许无条件跳转到某个标记位置,但它常常导致代码结构混乱、难以维护,被称为“意大利面条式代码”。- Java 中保留了
 goto关键字,但它没有被实现,不能使用。这是因为 Java 设计时就有意避免goto的副作用,而是通过带标签的break和continue提供有限且可控的跳转功能。
while与for的区别
for和while循环在语义上是可以互换的。通常,for循环适合已知循环次数或基于计数器的场景,而while循环更适合循环次数不确定、仅依赖条件判断的情况。
 