Java学习7:控制语句:switch语句及循环语句以及转向语句

switch语句

switch语句语法及原理

switch语句也是选择语句,也可以叫做分支语句。
语法格式:
switch(值){
case 值1:
java语句;
java语句;
......
break;
case 值2:
java语句;
java语句;
......
break;
case 值3:
java语句;
java语句;
......
break;
default:
java语句;
}
以上是一个完整的switch语句:
其中:break;语句不是必须的。default分支也不是必须的。
switch语句支持的值有:int类型以及String类型。
JDK8之前不支持String类型,只支持int类型。
在JDK8之后,switch语句开始支持字符串String类型。

switch语句中“值”与“值1”、“值2”比较的时候会使用“==”进行比较。
switch语句本质上是只支持int和String,但是byte,short,char也可以写入switch小括号里,只不过,byte,short,char,在执行时都会自动类型转换,转换成int类型。
执行原理:拿“值”与“值1”进行比较,如果相同,则执行该分支中的Java语句,然后遇到“break;”语句,switch语句就结束了。如果“值”与“值1”不相等,会继续拿“值”与“值2”进行比较,以此类推。
注意:如果分支执行了,但是分支最后没有“break”,此时会发生case穿透现象。
case穿透现象就是,值先和值1比较,匹配成功后,运行java语句,没有break的话,会继续执行下一个case里的语句,就不在比较了,直到遇到break。
所有的case都没有匹配成功,那么最后default分支会执行。
case合并

switch(值){
case 1: case 2: case 3:
System.out.println(“啥”)
}

这个“值”无论对应case1还是case2还是case3,都会输出“啥”。

switch案例

业务要求:
1.系统接收一个学生的考试成绩,根据考试成绩纯输出成绩的等级。
2.等级:
优秀:90-100
良好:80-90(不包括90)
中等:70-80(不包括80)
及格:60-70(不包括70)
不及格:0-60(不包括60)
3.要求成绩是一个合法的数字,成绩必须在0-100之间,成绩可能带有小数。
4.必须使用switch语句来完成

public class DengJi{
    public static void main(String[] args){
        java.util.Scanner s = new java.util.Scanner(System.in);
        System.out.print("请输入学生成绩:");
        double score = s.nextDouble();
        if(score < 0 || score > 100){
            System.out.println("您输入的学生成绩不合法");
            return;
        }
        int grade = (int)(score / 10);
        String str = "不及格";
        switch(grade){
        case 10: case 9:
            str = "优秀";
            break;
        case 8:
            str = "良好";
            break;
        case 7:
            str = "中等";
            break;
        case 6:
            str = "及格";
            break;
        }
        System.out.println("该学生的成绩等级是:" + str);
    }
}
等级.png

循环语句

在现实世界当中,有很多事情都是需要反复/重读的去做。对应到程序当中,如果有一块代码需要重复执行,此时为了减少代码量,我们使用循环语句。
相同的代码,重读出现的时候,可以使用循环语句。

for循环语句

语法机制:
for(初始表达式 ;条件表达式;更新表达式){
循环体;//循环体由java语句构成
}
注意:
1.初始化表达式最先执行,并且在整个循环中只执行一次。
2.条件表达式结果必须是一个布尔类型,也就是true或false。
执行原理:
初始化表达式最先执行,并且初始化表达式只执行一次,然后执行条件表达式,如果条件表达式为true,执行循环体,然后执行更新表达式,然后执行条件表达式,如果条件表达式为true,继续执行循环体,再执行更新表达式,以此类推,直到条件表达式为false,结束循环。
更新表达式的作用是:控制循环的次数,换句话说,更新表达式会更新某个标量的值,这样条件表达式的结果才有可能从true变成false,从而终止for循环的执行,如果缺失更新表达式很有可能会导致死循环。

for死循环以及常见的简单for循环

初始表达式、条件表达式、更新表达式,其实都不是必须的。

for(;;){
  System.out.println("死循环");
}

最常见的for循环

//循环10次,输出0-9
//对于这个for循环,其中int i= 0;最先执行,并且只执行一次。
//而且i变量属于for 循环的局部变量,for循环结束后,i的内存就释放了。
//这个i变量只能再for循环中使用。
//这个i变量属于for循环域。
//在main方法中没有办法直接使用。
for(int i = 0;i < 10;i++){
  System.out.println("i = " + i);
}

for循环变形

for(int i = 0;i <= 10;i++){
  System.out.println("i = " + i);//1,2,3,4,5,6,7,8,9,10
}

以下这样也是可以的。结果与上个代码相同

for(int i = 0;i <= 10;){
  System.out.println("i = " + i);
  i++;
}

变形

for(int i = 0;i <= 10;){
  i++;
  System.out.println("i = " + i);//2,3,4,5,6,7,8,9,10,11
}

其他形式

for(int i = 10;i  > 0;i--){
  System.out.println("i = " + i);//10,9,8,7,6,5,4,3,2,1
}
for(int i = 0;i < 10;i += 2){
  System.out.println("i = " + i);// 0,2,4,6,8
}
//1对3 的余数,结果还是1
for(int i = 100;i > 0;i %= 3){
  System.out.println("i = " + i);//100,1,1,1,1,......死循环
}

for循环案例:求1~100奇数和

使用for循环,实现1~100所有奇数求和
第一种方案:
思路:先找出1~100所有的的奇数,然后再考虑求和的事儿。
第一步:先从1取到100,一个数字一个数字取出来。
第二步:既然可以得到每一个数字,那么我们进一步判断这个数字是否为奇数。
奇数对2取余,结果都是1

public class Test1{
    public static void main(String[] args){
        int sum = 0;//初始值给0
        for(int i = 1; i <=100; i++){
            if(i % 2 == 1){//i为奇数
                sum += i;//累加(sum = sum + i;)
            }
        }
        //for循环结束之后,输出的sum结果就是最终的结果。
        System.out.println("1到100所有奇数求和结果为:" + sum);//2500
    }
}

第二种方案:
这种方案效率高,因为循环次数比较少。

public class Test1{
    public static void main(String[] args){
        int sum = 0;//初始值给0
        for(int i = 1; i < 100; i += 2){
        //这样写可以保证每一次取出的值都是奇数。不需要判断
            sum += i;
        }
        System.out.println("1到100所有奇数求和结果为:" + sum);
    }
}

for循环嵌套

所有合法的“控制语句”都可以嵌套使用。
不要因为for循环中嵌套了一个for循环,就感觉这个程序比较特殊,实际上大家可以,在分析外层for循环的时候把里面的for循环就当作一段普通的java语句/代码。

public class Test1{
    public static void main(String[] args){
        for(int k = 0; k < 2 ; k++ ){
            for(int i = 0; i < 10; i++ ){
                System.out.println("k = " + k);//10个0 10个1
                System.out.println("i = " + i);//两次0-9
            }
        }
    }
}

for嵌套实现九九乘法表

九九乘法表
11=1
1
2=2 22=4
1
3=3 23=6 33=9
......
19=9 29=18 ..................... 9*9=81
特点:共9行。第1行1个,第2行2个,第n行n个。

public class Test1{
    public static void main(String[] args){
        for(int i = 1; i<=9 ; i++ ){//i是行号1-9
                        //负责输出一行的。(内部for循环负责将一行上的全部输出)
            for(int j = 1; j<=i ; j++ ){
                System.out.print(j + "*" + i + "=" + j * i + "\t");
            }
        System.out.println();//换行
        }
    }
}
九九乘法表.png

while循环的语法机制和执行原理

语法机制:
while(布尔表达式){
循环体;
}
执行原理:判断布尔表达式的结果,如果为true就执行循环体,循环体结束之后,再次判断布尔表达式的结果,如果还是true,继续执行循环体,直到布尔表达式结果为false,while循环结束。
while循环的循环次数有可能是0次。while(false)的时候,就是执行了0次。所以,while循环的循环次数是:0~n次。
while(true)这样就是死循环了。
本质上while循环和for循环原理是相同的。

for(初始化表达式;布尔表达式;更新表达式){
  循环体;
}
初始化表达式;
while(布尔表达式){
  循环体;
  更新表达式;
}

for和while完全可以互换,只不过就是语法格式不一样。

do while的语法机制和执行原理

语法机制:
do{
循环体;
}while(布尔表达式);
注意:do ..while循环最后的时候不要漏掉“分号”。
执行原理:先执行循环体当中的代码,执行一次循环体之后,判断布尔表达式的结果,如果为true,则继续执行循环体,如果为false循环结束。
对于do..while循环来说,循环体至少执行1次。循环体的执行次数是:1~n次。
对于while循环来说,循环体执行次数是:0~n次。
do..while循环的特点是,先执行循环体再判断条件

break语句

break;这个语句比较特殊,特殊在break语句是一个单词成为一个完整的jaba语句。
另外:continue也是这样,它俩都是一个单词成为一条语句。
break 翻译为折断、弄断。
break可以用在switch语句当中,用来终止switch语句的执行,防止case穿透现象。
break也可以用在循环语句(for、while、do..while..)当中,用来终止循环的执行。
break;语句会让离它最近的循环终止结束掉。
break;语句的执行并不会让整个方法结束。break;语句主要是用来终止离它最近的哪个循环语句。
以for循环为例学习break语句。

public class Test1{
    public static void main(String[] args){
        for(int i = 1; i < 10 ; i++ ){
            if(i == 5){
            //break终止的不是if,不是针对if的,而是针对离它最近的循环。
            break;
            }
            System.out.println("i = " + i);//0 1 2 3 4
        }
    }
}
public class Test1{
    public static void main(String[] args){
        //外层for循环两次
        for(int k = 0; k < 2 ; k++ ){//外层for
            for(int i = 1; i < 10 ; i++ ){//内层for
                if(i == 5){
                break;//终止离它最近的for
                }
                System.out.println("i = " + i);
            }   
        
        }
    }
}

那么如果想要终止外层for该怎么办呢?
以下内容开发很少用,不要紧张。这种语法很少用,了解以下即可。
第一步:给循环起一个名字,例如:a:for、b:for
第二步:break a;就中止了。

public class Test1{
    public static void main(String[] args){
        a:for(int k = 0; k < 2 ; k++ ){
            b:for(int i = 1; i < 10 ; i++ ){
                if(i == 5){
                break a;//终止指定循环
                }
                System.out.println("i = " + i);
            }   
        
        }
    }
}

continue语句

continue翻译为:继续。
continue语句和break语句要对比着学习。
continue语句的作用是:终止当前“本次”循环,直接进入下一次循环继续执行。
continue语句后面也是可以指定循环的。

public class Test1{
    public static void main(String[] args){
        for(int i = 1; i < 10 ; i++ ){
            if(i == 5){
            continue;
            }
            System.out.println("i = " + i);//0 1 2 3 4 6 7 8 9
        }
    }
}

break和continue的区别:


面试官接完电话走了,这就是break.png

面试3号答不上来,直接叫下一位,这就是cocontinue.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354