一、顺序结构
顺序结构(按照代码的顺序,自上而下执行)
二、选择结构
A:if语句
格式:a
if(关系表达式){
语句体;
}
详细情况;
if(关系表达式){
如果关系表达式的结果是true,执行大括号中的语句
如果关系表达式的结果是false,就跳过不执行
}
执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体
如果是false就不执行语句体
格式b: if(关系表达式){
语句体1;
}else{
语句体2;
}
执行流程:
首先判断关系表达式看其结果是true还是false
如果是true就执行语句体1
如果是false就执行语句体2
格式c: if(关系表达式1){
语句体1;
}else if(关系表达式2){
语句体2;
}else if(关系表达式3){
语句体3;
}
…
else{
语句体n;
}
if语句的第三种格式可以省略else,但是省去了就不是三个格式其中之一了
注意事项:
1、如果在关系表达式小括号后面加上了一个分号,说明if语句结束
默认存在一个空语句体
2、括号都是成双成对出现的
3、小括号中的结果必须是布尔类型(boolean类型)
if语句的第二种格式与三目运算符的关系
注意事项:
1、当if-else格式中的语句体一条输出语句的时候,不能转换成三目运算符
2、当if-else格式中的语句体不是一条的时候,也不能转换成三目运算符
B: switch语句
switch选择结构:
1、格式:
switch(表达式){
case 常量1:
语句体1;
break;
case 常量2:
语句体;
break;
…
case 常量n:
语句体n;
break;
default:
语句体n+1:
break;
}
解释分析结构:
1、switch表达式的结果可以是哪些数据类型?(面试题)
表达式的结果可以是:byte,short,int,char
在JDK1.5以后可以是枚举类型
在JDK1.7以后可以是String
2、名词解释:
case: 后面跟的是要和表达式进行比较的值(常量),如果说匹配到了对应的case的值,
那么就执行相对应的语句体,而且这个语句的部分可以是一条语句,也可以是多条语句
break: 表示中断的意思,结束的意思,可以结束switch语句
default: 表示默认的意思,当表达式的值与所有的case的值都不匹配的时候,最后才执行
default中的语句体.(与if-else if…-else中最后else对应着去理解)
3、执行流程:
1)计算表达式的值
2)拿着这个计算好的值与case相对应的值(常量)按照顺序从上往下依次进行比较,如果有相同
的值,就开始执行此位置的case中的语句体内容。
3)、当语句体的内容执行完毕后,会紧接执行break语句,执行break语句就代表着咱们这个
switch选择结构的结束(跳出switch选择)
4)当第二步从上往下去匹配case的值的时候,如果没有匹配到相应的值,就会执行default
语句中语句体内容,最后跳出switch语句。
案例:(假设只能消费与口袋一样多钱的东西,只能买一样)
买饮料案例
可乐 3
旺仔牛奶 5
红牛 6
农夫山泉 2
脉动 4
用switch语句实现购物,键盘录入身上带了多少钱。
注意事项:
1、case后面的值不能有重复的
2、default语句可以进行省略,一般情况下,不建议删除。
3、case 后面紧跟着的只能是常量,或者常量之间的运算,不能是变量
4、break语句可以省略,代码也不会报错,一般情况下,不建议省略,如果你省略了,结果可能不是你想要的结果,当匹配到break语句省略的那个case的时候,首先会执行对应的语句体,然后从匹配到的case一直运行到有break语句为止。
5、default语句可以放在任意地方吗?
可以,因为我们的switch语句执行流程是严格按照先在所有的case中进行匹配,当所有的case都不匹配的时候,最后再去执行default语句,这和你default语句写的顺序没有关系。
if 和switch的嵌套使用案例:
import java.util.Scanner;
public class SwitchIfDemo1 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//可乐 3, 旺仔牛奶 5, 红牛 6, 农夫山泉 2, 脉动 4
//键盘录入数据表示身上有多少钱
System.out.println("请输入您身上带了多少钱:");
int money = sc.nextInt();
if(money>=2 & money<100){
System.out.println("欢迎光临!!!");
switch (money){
case 2:
System.out.println("购买农夫山泉");
break;
case 3:
System.out.println("购买可乐");
break;
case 4:
System.out.println("购买脉动");
break;
case 5:
System.out.println("购买旺仔牛奶");
break;
case 6:
System.out.println("购买红牛");
break;
default:
System.out.println("没有你想要的饮料");
break;
}
}else if(0<money & money<2){
System.out.println("您带的钱太少了,下次带多一点");
}else if(money >=100){
System.out.println("随便挑");
}else {
System.out.println("你是个穷鬼,下次再来吧");
}
}
}
三、循环结构
循环结构
循环语句可以在满足循环条件的情况下,反复执行某一段代码,
这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,
需要在合适的时候把循环判断条件修改为false,从而结束循环,
否则循环将一直执行下去,形成死循环。
1、分类:
1)for循环
2)、while循环
3) --do…while循环
循环语句的组成
初始化语句:
一条或者多条语句,这些语句完成一些初始化操作。
判断条件语句:
这是一个boolean 表达式,这个表达式能决定是否执行循环体。
循环体语句:
这个部分是循环体语句,也就是我们要多次做的事情。
控制条件语句:
这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条件中的变量,使得循环在合适的时候结束。
1)for循环:
语句格式:
for(初始化语句;判断条件语句;控制条件语句){
循环体代码;
}
执行流程:
A:执行初始化语句,只执行了一遍
B:执行判断条件语句,看其结果是true还是false
如果是false,循环结束。
如果是true,继续执行。
C:执行循环体语句
D:执行控制条件语句
E:回到B继续
使用for循环的注意事项
1、条件判断语句只能是boolean类型
2、当循环体的语句只有一条的时候,可以省略大括号,
如果循环体的语句有多条的时候,这时候需要添加大括号,如果不添加循环语句只针对第一条语句有效(建议,永远不要省略大括号)
3、如果在小括号后加分号,默认有一个空语句体,后面的代码为正常的代码块,不参与循环
4、初始化语句可以不在for循环中的小括号中体现,但是必须在使用之前定义好
5、条件判断语句可以删除,但是删除之后,就没有了控制循环结束的条件,就变成了死循环
6、控制条件语句删除之后,也变成了死循环,你可以删除,但是初始化的变量的值一定要在循环体中发生变化。
2)while循环
语句格式:
简化格式:
while(关系表达式){
循环体语句;
}
完整格式:
初始化语句;
while(关系表达式){
循环体语句;
控制条件语句;
}
3)for与while转换举例
结论:for循环可以等价转换为while循环
System.out.println("===============用for循环实现===============");
for(int i=1;i<=10;i++){
System.out.println("HelloWorld");
}
System.out.println("===============用while循环实现===============");
int i=1;
while (i<=10){
System.out.println("HelloWorld");
i++;
}
执行流程
1、先执行初始化语句
2、判断关系表达式的结果,
如果是true,进入while循环,执行循环体内容
如果是false,就不进入while循环,不执行循环体内容
3、如果进入循环体内容,执行循环体代码和控制条件语句
4、知道关系表达式的结果为false,终止while循环
死循环介绍:
for(; ; ) {}
while(true){}
while循环与for循环的区别
1、for循环结束后,在for循环中定义的初始化变量在外部无法使用
while循环结束后,由于初始化值变量是在while循环外部定义的,所以在while循环外部可以访问到。
2、 for循环实现的是一个范围内的循环
while循环,不知道将来要循环多少次,但是总会有个点去停止。
举例:每分钟监控某网页登录用户的情况,直到有非法用户登录,统计在此之前的次数
boolean flag = true;
while(flag){
if(非法用户登录){
flag = false;
}
}
4)do…while循环
语句格式:
基本格式
do {
循环体语句;
}while(判断条件语句);
扩展格式(开发中使用扩展格式)
初始化语句;
do {
循环体语句;
控制条件语句;
} while(判断条件语句);
do…while和while区别
while循环,执行的时候,会先进行一次判断,如果是true才执行循环体。
do…while循环,执行的时候,会先执行一次循环体内容,然后再判断是true还是false。
写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。
案例说明循环嵌套
需求1:请输出一个4行5列的星星(*)图案
* * * * *
* * * * *
* * * * *
* * * * *
需求2: 用循环实现打印如下三角形的*图案
*
* *
* * *
* * * *
* * * * *
*/
public class ForNestDemo {
public static void main(String[] args) {
//输出一个*
// System.out.println("*");
//输出5个*
// System.out.println("*");
// System.out.println("*");
// System.out.println("*");
// System.out.println("*");
// System.out.println("*");
//使用java的输出语句另外一种格式,将5个*输出在一行
// System.out.print("*\t");
// System.out.print("*\t");
// System.out.print("*\t");
// System.out.print("*\t");
// System.out.print("*\t");
//for循环改进打印一行
// for(int i=1;i<=5;i++){
// System.out.print("*\t");
// }
// System.out.println();
//
// for(int i=1;i<=5;i++){
// System.out.print("*\t");
// }
// System.out.println();
//
// for(int i=1;i<=5;i++){
// System.out.print("*\t");
// }
// System.out.println();
//
// for(int i=1;i<=5;i++){
// System.out.print("*\t");
// }
// System.out.println();
//用for循环改进打印4行5列的*
for (int i = 1; i <= 4; i++) { // 外层的for循环控制的是行
for (int j = 1; j <= 5; j++) {//内层的for循环控制的是列
System.out.print("*\t");
}
System.out.println();
}
System.out.println("===========需求2==============");
/**
\* *
\* * *
\* * * *
\* * * * *
\* * * * * *
*
\* 分析:
\* 1、总共有5行5列,我们可以先打印5行5列
\* * * * * *
\* * * * * *
\* * * * * *
\* * * * * *
\* * * * * *
*
\* 2、
*
\* * 第一行1个星,i=1,j=1
\* * * 第二行2个星,i=2,j=2
\* * * * 第三行3个星,i=3,j=3
\* * * * * 第四行4个星,i=4,j=4
\* * * * * * 第五行5个星,i=5,j=5
*
*
*/
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
System.out.print("*\t");
}
System.out.println();
}
System.out.println("==================================");
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*\t");
}
System.out.println();
}
System.out.println("===========打印9行9列的*三角型===========");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*\t");
}
System.out.println();
}
System.out.println("===========打印九九乘法表===========");
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
//1*1=1 1*2=2
System.out.print(j + "*" + i + "=" + (i * j) + "\t");
}
System.out.println();
}
}
}
跳转控制语句
前面我们已经说过了,Java中的goto是保留字,目前不能使用。
虽然没有goto语句可以增强程序的安全性,但是也带来很多不便,
比如说,我想在某个循环知道到某一步的时候就结束,现在就做不了这件事情。
为了弥补这个缺陷,
Java就提供了break,continue和return来实现控制语句的跳转和中断。
break,continue,return 它们都是关键字
break: 中断,结束的意思
break的使用场景:
根据单独使用的时候报错信息我们得出,break语句是适用于switch语句和循环语句中
1、在switch语句中使用
2、在循环语句中使用
3、单独在if语句中不能使用,但是镶嵌在循环语句中可以和if一起使用
for(int i=1;i<=10;i++){
System.out.println(i);
//当打印3的时候,结束for循环
if(i==3){
break;
}
报错修改快捷键:将鼠标光标移动至报错的横线上,按下alt+enter
需求:
九九乘法表,在内循环j是4的时候,我们break一下
注意事项:
单层跳出:在当前for循环中使用break,只结束当前for循环
多层跳出:带标签的break,格式:标签名 : 循环语句(开发中如果没有特殊需求,一般不会去使用)
//在内循环j是4的时候,我们break一下
xiaomi : for(int i=1;i<=9;i++){ //外层控制行
xiaoyun : for(int j=1;j<=i;j++){ //内层控制列
System.out.print(j+"*"+i+"="+(i*j)+"\t");
if(j==4){
break xiaomi; //结束当前循环
}
continue: 跳出当次循环
使用场景:
1、在循环语句中
2、离开使用场景的存在是没有意义的
return: 返回,退还
在main方法中使用,就相当于结束了main方法,也就是结束当前java程序
三种方法的比较:
// continue;
//需求:打印1-10,加入continue关键字,在打印3的时候加入
System.out.println("=====加continue==============");
for(int i=1;i<=10;i++){
if(i==3){
continue;
}
System.out.println(i);
}
System.out.println("=====加break==============");
for(int i=1;i<=10;i++){
if(i==3){
break;
}
System.out.println(i);
}
System.out.println("=====加入return===============");
for(int i=1;i<=10;i++){
if(i==3){
return;
}
System.out.println(i);
}
结果:
=====加continue==============
1
2
4
5
6
7
8
9
10
=====加break==============
1
2
=====加入return===============
1
2