1. 流程控制
-
在一个程序中,有很多的代码,代码的执行顺序,就是流程。
-
用于控制代码流程的方式,就是流程控制
-
流程控制的分类:
-
顺序结构:代码从上到下,从右到左依次执行。
-
分支结构:依据一定的条件选择程序执行的路径。
-
循环结构:重复的执行某一段代码的语法结构。
-
2. 分支结构
2.1 if语句
if
语法结构:
if(布尔表达式) {
执行代码块;
int a = 10;
}
if +CRUD
.....
-
语法解释:
-
布尔表达式:判断条件,如果判断为
true
,则执行大括号内的语句。 -
执行代码块:满足判断条件后所执行的代码语句。
-
-
执行过程
-
判断布尔表达式是否为
true
。 -
为
true
执行代码块。 -
为
false
直接略过。
-
-
if…else
-
语法结构:
-
if(布尔表达式) { 执行代码块1; } else { 执行代码块2; }
语法解释:
-
布尔表达式:判断条件,如果判断为
true
,则执行大括号内的语句。 -
执行代码块1:满足判断条件后所执行的代码语句。
-
执行代码块2:不满足判断条件后所执行的代码语句。
-
注意事项:
执行代码块1
和执行代码块2
能且仅能执行一块代码。 -
执行过程
-
判断布尔表达式是否为
true
。 -
为
true
执行代码块1。 -
为
false
执行代码块2。
-
-
if…else if…else
-
语法结构:
-
if(布尔表达式1) { 执行代码块1; } else if(布尔表达式2) { 执行代码块2; } else if(布尔表达式3) { 执行代码块3; } else if(布尔表达式……) { 执行代码块……; } else if(布尔表达式n) { 执行代码块n; } else { 执行代码块n+1; }
岳小鹏参加Java考试,他和父亲岳不群达成承诺: 如果: 成绩为100分时,奖励一辆BMW; 成绩为(80,99]时,奖励一台iphone xs max; 当成绩为[60,80]时,奖励一个 iPad; 其它时,什么奖励也没有。 请从键盘输入岳小鹏的期末成绩,并加以判断 class IfExam { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入岳小鹏期末成绩:(0-100)"); int score = scan.nextInt(); if (score == 100) { System.out.println("奖励一辆BMW");//be my wife! BMW <---> MSN } else if (score > 80 && score <= 99) { System.out.println("奖励一台iphone xs max"); } else if (score >= 60 && score <= 80) { System.out.println("奖励一个iPad"); } else { System.out.println("什么奖励也没有"); } } }
-
2.2 switch语句
3. 循环结构
3.1 while循环
-
语法结构:
-
switch(表达式变量) { case 常量1 : 执行代码块1; break; case 常量2 : 执行代码块2; break; case 常量…… : 执行代码块……; break; case 常量n : 执行代码块n; break; default: 执行代码块n+1; }
-
语法解释:
-
表达式变量:需要判断的值,与各个常量进行匹配。
-
常量:满足的条件。
-
执行代码块:满足条件后,所执行的代码块。
-
-
执行过程
-
表达式变量与常量进行匹配。
-
如果有匹配到,执行对应的代码块内容。
-
遇到
break
就终止代码执行。 -
如果没匹配到,执行
default
下代码块的内容。 -
// 四季交替 class SwitchTest { public static void main(String[] args) { String season = "winter"; switch (season) { case "spring": System.out.println("春暖花开"); break; case "summer": System.out.println("夏日炎炎"); break; case "autumn": System.out.println("秋高气爽"); break; case "winter": System.out.println("冬雪皑皑"); break; default: System.out.println("季节输入有误"); break; } } }
注意事项:如下的两种情况都编译不通过
-
/* boolean isHandsome = true; switch(isHandsome){ case true: System.out.println("我好帅啊~~~"); break; case false: System.out.println("我好丑啊~~~"); break; default: System.out.println("输入有误~~~"); } */ //情况二 /* int age = 10; switch(age){ case age > 18: System.out.println("成年了"); break; default: System.out.println("未成年"); } */
-
常量类型:(表达式中的6种类型)
-
Jdk1.5之前:
byte
、short
、int
、char
。 -
Jdk1.5:
枚举类型
。 -
Jdk7:
String
。
-
-
常量值不能重复。
-
case
后面只能跟常量,不能跟变量。 -
每个
case
的语句体后面,一定要跟上一个break
语句,否则就无法结束switch
语句,并且发生case
穿透。 -
default
语句:可以写在任意位置,无论写在什么位置,都是最后去匹配;也可以不写,如果不写,就有可能一个语句都执行不到。建议把default
语句加上。
-
-
/* 例题:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。 说明:如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。 */ class SwitchCaseTest1 { public static void main(String[] args) { /* int score = 78; switch(score){ case 0: case 1: case 2: ... case 100: } */ /* int score = 78; if(score >= 60){ }else{ } */ int score = 78; switch(score / 10){ case 0: case 1: case 2: case 3: case 4: case 5: System.out.println("不及格"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("及格"); break; } //更优的解决方案: switch(score / 60){ case 0: System.out.println("不及格"); break; case 1: System.out.println("及格"); break; } } }
2.3 if语句与switch语句的区别
-
相同点:都是进行判断,都可以表达分支结构。
-
不同点:
-
if
更加灵活,出现率较高,switch
出现率较低。 -
switch
的所有语句都可以使用if
进行替代。 -
if
语句更多的是做一些连续性区间值的判断,而switch
语句无法做到。 -
if
语句每次都需要获取表达式的值,而switch
只获取一次表达式的值,所以switch
的效率较高一些。
-
-
定义:重复的执行某一件事。
-
语法结构:
-
初始化变量; while(布尔表达式) { 执行代码块; 初始化变量的自增; }
-
注意:避免死循环。
-
语法解释:
-
初始化变量:声明一个变量,用于记录循环次数,只执行一次。
-
布尔表达式:进入循环的条件。
-
执行代码块:需要重复执行的代码块。
-
初始化变量的自增
-
-
执行过程:
-
初始化变量。
-
计算布尔表达式,如果为
false
则直接结束循环。 -
为
true
进入循环,执行代码块 -
执行初始化变量的自增。
-
回到第二步
-
class WhileTest { public static void main(String[] args) { //遍历100以内的所有偶数 int i = 1; while (i < 100) { if (i % 2 == 0) { System.out.println(i); } i++; } //出了while循环以后,仍可以调用。 System.out.println(i);//101 } }
3.2 do…while循环
-
语法结构:
-
初始化变量; do { 执行代码块; 初始化变量的自增; } while(布尔表达式);
-
语法解释:
-
初始化变量:声明一个变量,用于记录循环次数,只执行一次。
-
执行代码块:需要重复执行的代码块。
-
初始化变量的自增
-
布尔表达式:进入循环的条件。
-
-
执行过程:
-
初始化变量。
-
进入循环,执行循环代码块。
-
初始化变量的自增。
-
计算布尔表达式,如果为
false
则直接结束循环。 -
为
true
则回到第二步。
-
public class WhileDemo {
public static void main(String[] args) {
//遍历100以内的偶数,并计算所有偶数的和及偶数的个数
int sum = 0;
int total = 0;
int i = 0;
do {
if (i % 2 == 0) {
sum += i;
total++;
}
i++;
}
while (i <= 100);
System.out.println("1-100偶数和是:" + sum);
System.out.println("1-100偶数个数是:" + total);
}
}
3.3 for循环
-
语法结构:
-
for(初始化变量;布尔表达式;初始化变量的自增) { 执行代码块; }
-
语法解释:
-
初始化变量:声明一个变量,用于记录循环次数,只执行一次。
-
布尔表达式:进入循环的条件。
-
初始化变量的自增
-
执行代码块:需要重复执行的代码块。
-
-
执行过程:
-
初始化变量。
-
计算布尔表达式,如果为
false
则直接结束循环。 -
为
true
则执行代码块。 -
初始化变量的自增。
-
回到第二步。
-
-
/* 编写程序从1循环到520,并在每行打印一个值, 另外在每个3的倍数行上打印出“I”, 在每个5的倍数行上打印“Miss”, 在每个7的倍数行上打印输出“You”。 */ class ForTest1 { public static void main(String[] args) { for (int i = 1; i <= 520; i++) { System.out.print(i + " "); if (i % 3 == 0) { System.out.print("I"); } if (i % 5 == 0) { System.out.print("Miss"); } if (i % 7 == 0) { System.out.print("You"); } //换行 System.out.println(); } } }
3.4 三种循环语句的区别
-
do…while
语句和其他两种语句的区别:do…while
语句至少可以执行一次,另外两种有可能一次都执行不了。 -
while
语句和for
的区别: -
代码层面:
while
语句声明的初始化变量,在while
结束之后,还能继续使用;for
中声明的初始化变量,在for
结束之后,就无法使用了。 -
设计层面:
while
语句一般用于描述相对模糊的范围,其他的条件;for
用于描述相对准确,知道循环次数的循环。
3.5 跳转语句
-
跳转语句:在循环的循环体语句中,结束循环,控制循环。
-
continue
语句:结束本次循环,进入下次循环。 -
break
语句:结束当前循环。 -
return
语句:结束当前的方法。
3.6 循环的嵌套
在一次大的循环中,每次的循环内容(循环体)又是一个循环的操作,就需要在大循环中,定义一个小循环。称为循环的嵌套。
/*
嵌套循环的应用1:
九九乘法表
1 * 1 = 1
1 * 2 = 2 2 * 2 = 4
。。。
1 * 9 = 9 。。。 9 * 9 = 81
*/
class NineNineTable {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + " * " + i + " = " + (i * j) + " ");
}
System.out.println();
}
}
}
4.Scanner类
-
Scanner使用的基本步骤
-
导包
-
实例化
-
接收数据
-
/* 如何从键盘获取不同类型的变量:需要使用Scanner类 具体实现步骤: 1.导包 import java.util.Scanner; 2.Scanner 的实例化:Scanner scanner = new Scanner(System.in); 3.调用Scanner类的相关方法,来获取指定类型的变量 4.需要根据相应的方法,来输入指定类型的值,如果输入的数据类型与要求的数据类型不匹配时, 会报异常:InputMismatchException 导致程序终止。 */
import java.util.Scanner; public class JavaDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入你的姓名:"); String name = scanner.next(); System.out.println(name); System.out.println("请输入你的年龄:"); int age = scanner.nextInt(); System.out.println(age); System.out.println("请输入你的体重:"); double weight = scanner.nextDouble(); System.out.println(weight); System.out.println("你结婚了吗true/false:"); boolean isMarried = scanner.nextBoolean(); System.out.println(isMarried); System.out.println("请输入你的性别:"); String gender = scanner.next(); char genderChar = gender.charAt(0); System.out.println(genderChar); System.out.println("输入你的爱好"); String hobby = scanner.nextLine(); System.out.println(hobby); } } nextLine()方法是读取一整行,以一个回车符作为结束标记停止扫描 next() / nextInt() / nextDouble()等方法是,读取到第一个结束符【空格、回车、Tab键】作为结束标记停止扫描
-
5. Debug
-
Debug调试程序:
-
可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
-
使用方式:
-
在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到那里)
-
右键,选择Debug执行程序
-
程序就会停留在添加的第一个断点处
-
执行程序
-
f8:逐行执行程序(不进方法)
-
f7:进入到方法中(蓝色==>进入自定义方法)
-
f7:进入到方法中(红色==>进入j ava类库方法和自定义方法 )
-
shift+f8:跳出方法
-
f9:跳到下一个断点,如果没有下一个断点,那么就结束程序
-
F10:回到断点所在位置
-
重新运行
-
下一断点
-
暂停
-
ctrl+f2:退出debug模式,停止程序
-
查看所有断点
-
禁用断点
-
Console:切换到控制台
-