Java基础学习(分支结构+循环结构)
分支结构和循环结构
1.局部变量
| 局部变量 | 描述 |
|---|---|
| 定义位置: | 定义在方法体内 |
| 作用范围: | 离当前变量最近的大括号之内(从定义其行开始,到包含其结构结束) |
| 重名问题: | 重合的作用范围以内不能重名(不重合的作用范围是可以重名的) |
| 默认值: | 局部变量没有默认值 必须先赋值才能使用 |
| 生命周期: | 随着方法的入栈(压栈)而生效 随着方法的出栈(弹栈)而死亡 |
| 存储位置: | 基本数据类型存在栈中 引用数据类型,变量名在栈中,值在堆中 |
/**
* @author WHD
* @description TODO
* @date 2023/12/29 9:14
* 局部变量
* 定义位置:定义在方法体内
* 作用范围:离当前变量最近的大括号之内(从定义其行开始,到包含其结构结束)
* 重名问题:重合的作用范围以内不能重名(不重合的作用范围是可以重名的)
* 默认值:局部变量没有默认值 必须先赋值才能使用
*
* 生命周期:随着方法的入栈(压栈)而生效 随着方法的出栈(弹栈)而死亡
* 存储位置:
* 基本数据类型存在栈中
* 引用数据类型,变量名在栈中,值在堆中
*/
public class TestLocalVariable {
public static void main(String[] args) {
int a = 100;
int b;
// System.out.println(b);
// int a = 200; 不能重复定义
if(true){
// int a = 100;不能重复定义
int c = 100;
System.out.println(a);
System.out.println(c);
} else{
int c = 200;
System.out.println(a);
// System.out.println(c);
System.out.println(c);
}
// System.out.println(c);
}
}
2.Scanner工具类
Scanner属于JDK提供的一个工具类 用于接收用户输入的数据
此类位于java.util 这个包中
java.util属于工具包 此包中保存在各种工具类 Scanner 、Math数学工具类,Date日期工具类,集合工具类等等
Scanner类提供了一些丰富的方法来实现接收用户输入的不同类型的数据:
next() 接收用户输入的字符串nextByte() 接收用户输入的byte类型的数据
nextShort() 接收用户输入的short类型的数据
nextInt() 接收用户输入的int类型的数据nextLong() 接收用户输入的long类型的数据
nextFloat()接收用户输入的float类型的数据
nextDouble() 接收用户输入的double类型的数据
nextBoolean() 接收用户输入的boolean类型的数据
注意:没有nextChar() 即表示 接收字符也要使用next()Scanner位于JDK提供的包中,与我们所写的类不在同包,使用不在同包的类,要使用import关键字导包。
如果输入了类型不匹配的数据(自动类型提升的没问题) 会出现
InputMismatchException输入不匹配异常异常会中断程序 即和后续的代码不再执行
import java.util.Scanner; // 导包语句 书写在包声明之后 类声明之前
/**
* @author WHD
* @description TODO
* @date 2023/12/29 9:49
* Scanner 类使用
* 需求:使用Scanner类接收用户输入的信息
*
* 如果输入了类型不匹配的数据(自动类型提升的没问题) 会出现InputMismatchException 输入不匹配异常
* 异常会中断程序 即和后续的代码不再执行
*
*
*
*/
public class TestScanner {
public static void main(String[] args) {
// 第一步 创建Scanner类型的变量 取名为input
Scanner input = new Scanner(System.in);
// 第二步 提示用户输入信息
System.out.println("请输入您的姓名");
// 第三步 接收用户输入信息 并且保存到变量中
String name = input.next();
// 第四步 打印用户输入内容
System.out.println("您输入的名字为:" + name);
// 接下来接收其他的数据类型 重复以上,2,3,4步即可 调用不同的方法
System.out.println("请输入您的年龄");
int age = input.nextInt();
System.out.println("您输入的年龄为:" + age);
System.out.println("请输入您的身高");
double height = input.nextDouble();
System.out.println("您输入的身高为:" + height);
System.out.println("请输入您今天是否开心");
boolean isHappy = input.nextBoolean();
System.out.println(isHappy == true ? "恭喜你很开心" : "不要灰心丧气");
// 实际开发中 我们都会直接书写布尔类型变量名 表示判断是否为true
System.out.println(isHappy ? "恭喜你很开心" : "不要灰心丧气");
System.out.println("程序结束");
}
}
3. 分支结构
3.1 基本if结构
if(布尔表达式){ //代码块1 }
后续代码... 执行流程: 对布尔表达式进行判断。 结果为true,则先执行代码块1,再执行后续代码。 结果为false,则跳过代码块1,直接执行后续代码。
import sun.rmi.server.Activation$ActivationSystemImpl_Stub;
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 10:48
* 需求:;根据用户输入的成绩 判断是否要进行奖励
* 如果
* Java成绩大于80 并且 MySQL成绩大于90分
* 或者
* HTML成绩大于95 并且 JS成绩等于100
* 获得奖励
*/
public class TestCommentIf3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入Java成绩");
double javaScore = input.nextDouble();
System.out.println("请输入MySQL成绩");
double mySQLScore = input.nextDouble();
System.out.println("请输入HTML成绩");
double HTMLScore = input.nextDouble();
System.out.println("请输入JS成绩");
double JSScore = input.nextDouble();
if( (javaScore > 80 && mySQLScore > 90) || (HTMLScore > 95 && JSScore == 100)){
System.out.println("恭喜获得奖励");
}
System.out.println("程序结束");
}
}
3.2 if-else结构
语法: if(布尔表达式){ //代码块1 }else{ //代码块2 }
后续代码... 执行流程: 对布尔表达式进行判断。 结果为true,则先执行代码块1,再退出整个结构,执行后续代码。 结果为false,则先执行代码块2,再退出整个结构,执行后续代码。
注意:else结构不能单独出现 必须结合if结构使用
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 10:45
* 根据用户输入的年龄判断是否成年
*/
public class TestCommentIf2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入年龄");
int age = input.nextInt();
if(age >= 18){
System.out.println("恭喜你,成年了");
}else{
System.out.println("很遗憾,未成年");
}
System.out.println("程序结束");
}
}
3.3 多重if结构
语法: if(布尔表达式1){ //代码块1 }else if(布尔表达式2){ //代码块2 }else if(布尔表达式3){ //代码块3 }else{ //代码块4 }
执行流程: 表达式1为true,则执行代码块1,再退出整个结构。
表达式2为true,则执行代码块2,再退出整个结构。
表达式3为true,则执行代码块3,再退出整个结构。
以上均为false,则执行代码块4,再退出整个结构。
注意:相互排斥,有一个为true,其他均不再执行, 适用于区间判断。
多重if
多种if可以用于判断多种情况 中间的else-if没有个数限制 根据需求书写
结尾的else结构不是必须的 根据需求是否书写
如果书写了else 那么整个多重if结构为多选1
如果没有书写else 那么整个多重if结构为多选1 或者 多选0
注意:如果使用多重if处理连续区间的情况 那么条件的顺序必须为升序 或者 降序 不能是乱序
需求:根据用户输入的分数,划分等级
大于95 优秀
大于80 良好
大于70 中等
大于59 及格
其他情况 不及格
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 11:08
* 多重if
* 多种if可以用于判断多种情况 中间的else-if没有个数限制 根据需求书写
* 结尾的else结构不是必须的 根据需求是否书写
* 如果书写了else 那么整个多重if结构为多选1
* 如果没有书写else 那么整个多重if结构为多选1 或者 多选0
*
* 注意:如果使用多重if处理连续区间的情况 那么条件的顺序必须为升序 或者 降序 不能是乱序
*
* 需求:根据用户输入的分数,划分等级
* 大于95 优秀
* 大于80 良好
* 大于70 中等
* 大于59 及格
* 其他情况 不及格
*/
public class TestManyIf1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的分数");
int score = input.nextInt();
if(score > 95){
System.out.println("优秀");
}else if(score > 80){
System.out.println("良好");
}else if(score > 70){
System.out.println("中等");
}else if(score > 59){
System.out.println("及格");
}else{
System.out.println("不及格");
}
System.out.println("程序结束");
}
}
使用多重if结构实现 根据名次进行对应的奖励
第一名 奖励夏令营一周
第二名 奖励苹果15袋
第三名 奖励笔记本一本
第四名 口头表扬一次
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 11:19
* 使用多重if结构实现 根据名次进行对应的奖励
* 第一名 奖励夏令营一周
* 第二名 奖励苹果15袋
* 第三名 奖励笔记本一本
* 第四名 口头表扬一次
* 使用多重if处理非连续区间的情况 对条件顺序没有要求
*
*/
public class TestManyIf2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入名次");
int number = input.nextInt();
if(number == 2){
System.out.println("奖励苹果15袋");
}else if(number == 1){
System.out.println("奖励夏令营一周");
}else if(number == 4){
System.out.println("口头表扬一次");
}else if(number == 3){
System.out.println("奖励笔记本一本");
}
System.out.println("程序结束");
}
}
3.4 嵌套if
if(外层表达式){ if(内层表达式){ //内层代码块1 }else{ //内层代码块2 } }else{ //外层代码块 }
执行流程: 当外层条件满足时,再判断内层条件。
注意: 一个选择结构中,可嵌套另一个选择结构。 嵌套格式正确的情况下,支持任意组合。
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 13:55
* 嵌套if结构:当外层条件满足时,再判断内层条件。
* 一个选择结构中,可嵌套另一个选择结构。
* 嵌套格式正确的情况下,支持任意组合。
*
* 需求:学校举行百米跑步比赛 如果时间小于13秒 可以进入决赛
* 然后再根据性别进行分组 男子组 或者 女子组
*
*/
public class TestInnerIf1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的跑步时间");
double time = input.nextDouble();
if(time < 13){
System.out.println("请输入您的性别");
String sex = input.next();
// 表示可以进入决赛
// 判断性别 判断字符串的内容不要使用==比较(原因后续讲解)
// 应该使用String类提供的equals()方法
// 用法格式:字符串变量名.equals("内容") 如果变量和内容相同 结果为true 不同则为false
if(sex.equals("男")){
System.out.println("恭喜进入男子组决赛");
}else if(sex.equals("女")){
System.out.println("恭喜进入女子组决赛");
}else{
System.out.println("暂不支持其他性别,请等待下一届");
}
}else{
// 淘汰
System.out.println("很遗憾,被淘汰");
}
System.out.println("程序结束");
}
}
4. if结构细节总结
if语句块只有一条执行语句时,一对{}可以省略,但建议保留
当多重if结构是“多选一”时,最后的else是可选的,根据需要可以省略
当多重if结构多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓
当多个条件是“连续的区间”时,条件必须为升序或者降序
5.switch结构
语法: switch(变量|表达式){ case 值1: 逻辑代码1; case 值2: 逻辑代码2; case 值n: 逻辑代码n; default: 未满足时的逻辑代码; }
可判断的类型: byte、short、int、char、String(JDK7+)
执行流程: 如果变量中的值等于值1,则执行逻辑代码1。 如果变量中的值等于值2,则执行逻辑代码2。 如果变量中的值等于值n,则执行逻辑代码n。 如果变量中的值没有匹配的case值时,执行default中的逻辑代码。
注意:所有case的取值不可相同。
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 14:17
* switch擅长处理某个值属于固定等值的情况
*
* switch支持的数据类型:byte short int char String(JDK7+) 枚举(JDK5+)
*
* case穿透:执行完当前case语句 继续执行后续的case语句
*
* break关键字:加在case之后 表示执行完当前case语句 直接跳出switch结构 避免case穿透
*
* 使用switch结构实现 根据名次进行对应的奖励
* 第一名 奖励夏令营一周
* 第二名 奖励苹果15袋
* 第三名 奖励笔记本一本
* 第四名 口头表扬一次
*/
public class TestSwitch1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的名次");
int number = input.nextInt();
switch(number){
case 1:
System.out.println("奖励夏令营一周");
break;
case 2:
System.out.println("奖励苹果15袋");
break;
case 3:
System.out.println("奖励笔记本一本");
break;
case 4:
System.out.println("口头表扬一次");
break;
default:
System.out.println("除了1~4名之外,其他没有任何奖励");
break;
}
System.out.println("程序结束");
}
}
合理利用switch结构的case穿透
使用switch结构实现 根据名次进行对应的奖励
第一名 奖励夏令营一周
第二名 奖励夏令营一周
第三名 奖励笔记本一本
第四名 口头表扬一次
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 14:28
*
* 合理利用switch结构的case穿透
* 使用switch结构实现 根据名次进行对应的奖励
* 第一名 奖励夏令营一周
* 第二名 奖励夏令营一周
* 第三名 奖励笔记本一本
* 第四名 口头表扬一次
*
*/
public class TestSwitch2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的名次");
int number = input.nextInt();
switch(number){
case 1:
case 2:
System.out.println("奖励夏令营一周");
break;
case 3:
System.out.println("奖励笔记本一本");
break;
case 4:
System.out.println("口头表扬一次");
break;
default:
System.out.println("继续加油");
break;
}
System.out.println("程序结束");
}
}
switch结构的其他数据类型使用
switch支持的数据类型:byte short int char String(JDK7+) 枚举(JDK5+)
/**
* @author WHD
* @description TODO
* @date 2023/12/29 14:33
* switch结构的其他数据类型使用
* switch支持的数据类型:byte short int char String(JDK7+) 枚举(JDK5+)
*/
public class TestSwitch3 {
public static void main(String[] args) {
byte b1 = 1;
short s1 = 2;
int i1 = 3;
char ch1 = '中';
String str1 = "A";
switch(str1){
case "A":
System.out.println("取值为1");
break;
case "20013":
System.out.println("取值为2");
break;
case "\u4e2f":
System.out.println("取值为3");
break;
case "4":
System.out.println("取值为4");
break;
}
System.out.println("程序结束");
}
}
6.循环结构
任何循环都有以下四个必不可少的部分:
1.计数器初始化
2.循环条件
3.循环体
4.计数器变化
6.1 while循环
计数器初始化
while ( 循环条件 ) { 循环操作
}
while循环
while单词:当……
需求:使用while循环打印100句好好学习
while循环可以实现、解决循环次数固定的情况
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:07
* while循环
* while单词:当……
*
* 任何循环都有以下四个必不可少的部分:
* 1.计数器初始化
* 2.循环条件
* 3.循环体
* 4.计数器变化
*
* 需求:使用while循环打印100句好好学习
*
* while循环可以实现、解决循环次数固定的情况
*
*/
public class TestWhile1 {
public static void main(String[] args) {
// 计数器初始化
int i = 1;
// 循环条件
while(i <= 10000){
// 循环体
System.out.println("第" + i + "次好好学习");
// 计数器变化
++i;
}
System.out.println("程序结束");
}
}
使用while循环实现
需求:老师每天检查赵四的学习任务是否合格,如果不合格,则继续进行。
老师给赵四安排的每天的学习任务为:上午阅读教材,学习理论部分,下午上机编程,掌握代码部分。
当前需求为:while循环实现的循环次数不固定的情况
总结:while循环可以用于处理循环次数确定以及循环次数不确定的情况
通常用于处理循环次数不确定的情况 因为循环次数确定的情况 for循环更为简洁
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:14
* 使用while循环实现
* 需求:老师每天检查赵四的学习任务是否合格,如果不合格,则继续进行。
* 老师给赵四安排的每天的学习任务为:上午阅读教材,学习理论部分,下午上机编程,掌握代码部分。
*
* 当前需求为:while循环实现的循环次数不固定的情况
*
* 总结:while循环可以用于处理循环次数确定以及循环次数不确定的情况
* 通常用于处理循环次数不确定的情况 因为循环次数确定的情况 for循环更为简洁
*
*/
public class TestWhile2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入你今天的任务是否合格?y/n");
// 相当于:计数器初始化
String answer = input.next();
// 循环条件
while(answer.equals("n")){
// 循环体
System.out.println("上午阅读教材,学习理论概念");
System.out.println("下午上机编程,掌握代码部分");
System.out.println("请输入你今天的任务是否合格?y/n");
// 相当于:计数器变化
answer = input.next();
}
System.out.println("程序结束");
}
}
6.2 do-while循环
计数器初始化
do {
循环操作
}while ( 循环条件 );
经过几天的学习,老师给赵四一道测试题,
让他先上机编写程序完成,然后老师再检查是否合格。如果不合格,则继续编写……
分析:当前需求需要赵四先做题 执行做题的操作 然后再判断是否合格 相当于操作在判断之前
所以应该使用do-while循环来实现
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:29
* 经过几天的学习,老师给赵四一道测试题,
* 让他先上机编写程序完成,然后老师再检查是否合格。如果不合格,则继续编写……
*
* 分析:当前需求需要赵四先做题 执行做题的操作 然后再判断是否合格 相当于操作在判断之前
* 所以应该使用do-while循环来实现
*/
public class TestDoWhile1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String answer;
do{
System.out.println("上机编程代码……");
System.out.println("请输入您是否合格?y/n");
answer = input.next();
}while(answer.equals("n"));
System.out.println("恭喜你完成任务");
System.out.println("程序结束");
}
}
使用do-while循环实现打印100次好好学习
do-while循环可以实现循环次数确定 以及 循环次数不确定的情况
通常用于处理循环次数不确定的情况 因为循环次数确定的情况 for循环更为简洁
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:36
* 使用do-while循环实现打印100次好好学习
*
* do-while循环可以实现循环次数确定 以及 循环次数不确定的情况
* 通常用于处理循环次数不确定的情况 因为循环次数确定的情况 for循环更为简洁
*
*/
public class TestDoWhile2 {
public static void main(String[] args) {
int i = 1;
do{
System.out.println("第" + i + "遍好好学习");
i++;
}while(i <= 100);
}
}
6.3 while和do-while的区别?
while 先判断 后执行 条件不成立 一次都不执行
do-while 先执行后判断 不管条件是否成立 至少执行一次
都通常用于循环次数不确定的情况
6.4 for循环
for( 计数器初始化 ;判断条件 ;计数器变换 ){ 循环体 }
for循环 循环次数确定的情况 for循环更为简洁
for循环执行的顺序:
1.计数器初始化 只执行一次
2.循环条件
3.循环体
4.计数器变化
需求:使用for循环实现打印100遍好好学习
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:46
* for循环 循环次数确定的情况 for循环更为简洁
* for循环执行的顺序:
* 1.计数器初始化 只执行一次
* 2.循环条件
* 3.循环体
* 4.计数器变化
*
* 需求:使用for循环实现打印100遍好好学习
*/
public class TestFor1 {
public static void main(String[] args) {
for(int i = 1;i <= 10000;++i){
System.out.println("第" + i + "遍好好学习");
}
}
}
使用for循环实现:循环输入某同学结业考试的5门课成绩,并计算平均分
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:53
* 使用for循环实现:循环输入某同学结业考试的5门课成绩,并计算平均分
*/
public class TestFor2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入您的名字");
String name = input.next();
double sum = 0;
for(int i = 1;i <= 5;i++){
System.out.println("请输入第" + i + "门成绩");
double score = input.nextDouble();
sum += score;
}
System.out.println(name + "同学的平均分是:" + sum / 5);
System.out.println("程序结束");
}
}
根据用户输入的数字打印加法表
如何实现递减效果:使用一个固定的值 减去一个递增的值
import java.util.Scanner;
/**
* @author WHD
* @description TODO
* @date 2023/12/29 15:57
* 根据用户输入的数字打印加法表
*
* 如何实现递减效果:使用一个固定的值 减去一个递增的值
*/
public class TestFor3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字");
int num = input.nextInt();
for(int i = 0;i <= num;i++){
System.out.println(i + "+" + (num - i) + "=" + num);
}
System.out.println("程序结束");
}
}
8.三种循环对比
区别1:语法不同
区别2:执行顺序 while 循环:先判断,再执行 do-while循环:先执行,再判断 for循环:先判断,再执行
区别3:适用情况 循环次数确定的情况,通常选用for循环 循环次数不确定的情况,通常选用while或do-while循环
9.break关键字
break关键字 可以用于switch结构 或者 循环结构中 break用在循环结构中 通常(99%)要结合分支语句使用
分别表示跳出、结束、终止switch结构或者循环结构
需求:使用循环描述跑步10圈 当跑完第5圈 退出
alt + shift + ↑ ↓ 上下移动当前行代码
10.continue关键字
continue:单词含义 继续
只能用于循环中 表示跳出本次循环 继续执行下一次循环
11.break和continue关键字的区别
使用场合 break用于switch结构和循环结构中 continue用于循环结构中
作用(循环结构中) break语句终止某个循环,程序跳转到循环块外的下一条语句 continue跳出本次循环,进入下一次循环 双重循环亦如此
12.break和continue关键字补充(了解)
问题:在循环中存在switch switch中的break会不会中断循环?
不会 因为break默认情况下 只针对于离其最近的结构生效
如何让switch中的break跳出循环?
可以在循环前边加上标记,使用break跳出指定标记名称
/**
* @author WHD
* @description TODO
* @date 2024/1/2 14:39
* 问题:在循环中存在switch switch中的break会不会中断循环?
* 不会 因为break默认情况下 只针对于离其最近的结构生效
*
* 如何让switch中的break跳出循环?
*
*
*
*/
public class TestBreak {
public static void main(String[] args) {
abc : for (int i = 1; i <= 5; i++) {
switch (i) {
case 1:
System.out.println("数值为1");
break;
case 2:
System.out.println("数值为2");
break;
case 3:
System.out.println("数值为3");
break abc;
case 4:
System.out.println("数值为4");
break;
case 5:
System.out.println("数值为5");
break;
}
}
System.out.println("---------------------------------------------");
sb : for(int i = 1;i <= 5;i++){
for(int j = 1;j < 5;j++){
if(j == 3){
continue sb;
}
System.out.print(j + "\t");
}
System.out.println();
}
System.out.println("程序结束 ");
}
}