一、Java的逻辑控制语句的大体分类:
二、顺序结构
1.顺序结构:即按顺序执行代码(从头到尾按顺序执行代码),如
public class Main{
public static void main(String args[]){
int num1 = 10;
int num2 = 20;
System.out.println(num1 + num2);//先输出30
System.out.peintln("111");//再输出111
System.out.peintln("222");//然后输出222
System.out.peintln("333");//最后输出333
}
}
三、选择结构(又叫分支结构)
1.if语句
- 语法格式:
- 写法一:
if(布尔表达式){ //代码语句 }
代码示例:
int x = 10; if (x > 5) { System.out.println("x 大于 5"); }
- 写法二:
-
if(布尔表达式) { //代码语句 }else{ //代码语句 }
代码示例:
int x = 10; if (x > 15) { System.out.println("x 大于 15"); } else { System.out.println("x 不大于 15"); }
- 写法三:
if(布尔表达式){ //代码语句 }else if(布尔表达式){ //代码语句 } else{ //代码语句 }
代码示例:
int x = 10; if (x > 15) { System.out.println("x 大于 15"); } else if (x > 5) { System.out.println("x 大于 5,但不大于 15"); } else { System.out.println("x 不大于 5"); }
-
- 写法一:
- 若if()的括号内的布尔表达式的结果为true则执行if语句内的代码。若if()括号内的值为flase,且还有else if()语句,若else if()的括号内的布尔表达式的值为true则执行else if语句内的代码,否则执行else语句内的代码;若else if()的括号内的布尔表达式的值为flase,则执行else语句内的代码
- 注意事项:
- if()语句和else if()语句的括号内必须为布尔表达式!!
- 分号问题:
int num = 1; if(num == 0); { System.out.println("hello world");//输出hello world }
这段代码一定会输出hello world,因为无论如何System.out.println("hello world");这一句代码一定会实现。原因是if(num == 0);这一句代码后面有分号,有分号就证明if(num == 0)是一个单独的语句,if在执行的时候是不存在执行语句的,故会直接在判断完if()语句括号内的布尔表达式的真值之后继续向下执行,也就是继续向下执行System.out.println("hello world");
//上面的代码等价于 int num = 1; if(num == 0); System.out.println("hello world");//输出hello world
-
悬垂else问题:if/else语句中可以不加大括号也能向下执行语句,但是只能执行一句,即跟if/else最近的语句
int num1 = 10; if(num1%2!=0) System.out.println(num1 + "为奇数");//num1为奇数就执行这一句代码 else System.out.println(num1 + "为偶数");//num1为偶数就执行这一句代码 int num2 = 13; if(num2%2!=0) System.out.println(num2 + "为奇数");//if语句能管得到的只有这一句 num2++;//这一句一定会执行 System.out.println(num2);//输出num2为14
2.switch语句
- 语法格式:
switch(表达式){ case 常量表达值1:{ 语句1; break; } case 常量表达值1:{ 语句1; break; } case 常量表达值1:{ 语句1; break; } ………… default:{ 内容不满足时的执行语句; break; } }
-
switch(表达式)语句括号内表达式的值不能是float、double、long、boolean类型的数据,如switch(a>0)这个就会报错,因为a>0是boolean类型的语句,不能写在switch的括号里;byte、char、short、int、String、枚举类型可以写在switch()的括号里
-
使用 int 类型的 switch 示例:
public class SwitchExample { public static void main(String[] args) { int num = 2; String day = "Monday"; // 使用 int 类型的 switch switch (num) { case 1: System.out.println("数字为1"); break; case 2: System.out.println("数字为2"); break; default: System.out.println("未知数字"); } // 使用 String 类型的 switch switch (day) { case "Monday": System.out.println("星期一"); break; case "Tuesday": System.out.println("星期二"); break; default: System.out.println("其他星期几"); } } }
-
使用 String 类型的 switch 示例:
public class StringSwitchExample { public static void main(String[] args) { String day = "Monday"; switch (day) { case "Monday": System.out.println("星期一"); break; case "Tuesday": System.out.println("星期二"); break; case "Wednesday": System.out.println("星期三"); break; default: System.out.println("其他星期几"); } } }
-
使用枚举类型的 switch 示例:
public class EnumSwitchExample { enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public static void main(String[] args) { Day day = Day.MONDAY; switch (day) { case MONDAY: System.out.println("星期一"); break; case TUESDAY: System.out.println("星期二"); break; case WEDNESDAY: System.out.println("星期三"); break; default: System.out.println("其他星期几"); } } }
-
- case后的常量值不能重复,否则会报错,如
case 1:
System.out.println("数字为1");
break;
case 1:
System.out.println("数字为2");
break;
这个代码会编译出错,因为case后的常量值重复了
- switch()的括号内不能表达复杂的条件,比如num>10&&num<20这就不行,放进switch的括号里会报错
- switch语句可以嵌套
public class NestedSwitch { public static void main(String[] args) { int outerSwitch = 1; int innerSwitch = 2; switch (outerSwitch) { case 1: switch (innerSwitch) { case 1: System.out.println("内部 switch - 1"); break; case 2: System.out.println("内部 switch - 2"); break; default: System.out.println("内部 switch - 默认"); } break; case 2: System.out.println("外部 switch - 2"); break; default: System.out.println("外部 switch - 默认"); } } }
四、循环结构
1.for循环
- 语法格式:
for(表达式1;表达式2;表达式3){
//表达式1是用于初始化循环变量的初始值设置
//表达式2是循环条件,满足条件则继续循环,否则结束循环
//表达式3是更新循环变量
//代码语句
}
-
代码示例:
//用for循环打印1-10
int n = 10;
for(int i = 1;i <= n;i ++){
System.out.println(i);
}
-
for之后不写{ }则这只能管到for紧跟的那句代码的执行
- for();和for()语句括号内定义的变量i
若将代码改成
int n = 10;
for(int i = 1;i <= n;i ++);{
System.out.println(i);
}
for(int i = 1; i <= n; i ++);
这个 for
循环实际上没有循环体(因为它后面直接跟了一个分号),所以它会迭代 i
从 1 到 10,但循环体内不执行任何操作。
并且会报错,for(int i = 1; i <= n; i ++);
for语句后有分号,意味着for循环到此结束,i是for循环内的变量,只在for内有效,出了for循环之后i无效了,故在{ System.out.println(i); }
这个代码块是一个独立的语句块,它会在 for
循环执行完毕后被执行,而i不属于for语句之外的语句,故System.out.println(i)这句代码会在i那里报错。
- for循环内定义的变量
for (int i = 1; i <= 5; i++) {
int square = i * i; // 在循环内部定义变量 square,并赋值为 i 的平方
System.out.println("Square of " + i + " is: " + square);
}
此处代码的i和square都属于是for循环体内定义的变量,它们属于for循环体内,出了for循环这两个变量就没有用了,再额外使用没有在外部定义的i和square的话就会报错。并且在不同的for循环体内变量可以是一样的,即两个不同的for循环可以均使用i和square作为它们内部的变量,不会报错,如:
for (int i = 1; i <= 5; i++) {
int square = i * i; // 在循环内部定义变量 square,并赋值为 i 的平方
System.out.println("Square of " + i + " is: " + square);
}
for (int i = 1; i <= 9; i++) {
int square = i * i; // 在循环内部定义变量 square,并赋值为 i 的平方
System.out.println("Square of " + i + " is: " + square);
}
2.while循环
- 语法格式:
whiel(循环条件){
//循环语句;
}
-
循环条件一定要为布尔表达式,循环条件的值为true则执行循环,false则不执行循环
int num = 9; while(num>0){ System.out.println(num); num--; }
-
与if类似,while下面的语句可以不写{ },但是不写的话,while只能管while后紧跟while的那句代码的执行
- 与if类似,while后面不要多写分号否则可能导致循环不能正确执行,如
int num = 1; while(num <= 10);{ System.out.println(num); num++; }
while(num <= 10);因为有分号,所以它是一句单独的语句,又因为num = 1 ,满足小于等于10的条件,所以while语句恒成立,所以会一直循环下去,即死循环,System.out.println(num)和num++这两句语句永远没有执行的机会
3.do……while循环
- 语法格式:(先执行循环语句,在判定循环条件,循环条件成立则继续执行循环,否则循环结束)
do{
//循环语句
}while(循环条件);//这里while一定要加分号!!!
-
代码示例:
int count = 1;
do {
System.out.println("Count is: " + count);
count++;
} while (count <= 5);
-
do……while和while的区别:
do-while 循环:
- 执行顺序:先执行循环体内的代码,然后再检查循环条件是否为真。
- 特点:无论循环条件是否为真,
do-while
至少会执行一次循环体内的代码。
while 循环:
- 执行顺序:先检查循环条件是否为真,如果为真则执行循环体内的代码,然后再重复这个过程;如果条件为假,则直接跳过循环体。
- 特点:如果初始时循环条件就为假,则
while
循环内的代码一次也不会执行。
4.扩展:continue和break的区别
- break:某次循环执行完之后不用再继续执行剩下的循环时,使用break结束循环
for (int i = 1; i <= 10; i++) { if (i == 5) { break; // 当 i 等于 5 时跳出循环 } System.out.println(i); } /*输出: 1 2 3 4 5 */
- continue:在某次循环下,当次循环不用再继续执行了,要跳过该次执行,进入下一次循环执行,则使用continue跳过当次执行
for (int i = 1; i <= 5; i++) { if (i % 2 == 0) { continue; // 如果 i 是偶数,则跳过本次循环 } System.out.println(i); } /*输出: 1 3 5 */