小言_互联网的博客

Java零基础学习之路(六)Java选择语句(if、switch)

374人阅读  评论(0)

本章节目标:

记住所有控制语句的语法格式,理解不同的控制语句分别在哪些不同的情况下使用,并且能够熟练编写这些控制语句。

知识框架:

 

Java控制语句概述

在大部分编程语言当中都会存在控制语句,控制语句是一个程序的灵魂,我们只依靠“标识符、关键字、变量、运算符”等零散的知识点是无法进行流程控制的,无法实现一个具体的功能或业务,所以控制语句这一章节非常重要。

现实生活中哪些业务需要使用控制语句呢?比如说“小孩身高如果高于1.2米,则乘坐交通工具就需要收费了,反之则免费”,再比如“A账户向B账户转账10000元,首先需要判断A账户的余额是否大于等于10000元,如果余额充足则可以转账,不足则无法转账”等等,这些业务当中都需要使用控制语句进行控制才能完成。

什么是控制语句,官方的解释是这样的:

控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。Java语言中共有8种控制语句,可以分为“选择语句”,“循环语句”,“转向语句”,“返回语句”四类。那么,这8种控制语句分别是什么呢?if语句、switch语句、for循环、while循环、do..while循环、break语句、continue语句、return语句。其中if和switch语句属于选择语句,for、while、do..while语句属于循环语句,break和continue语句属于转向语句,return属于返回语句。接下来让我们认真的学习每一个语句。

Java选择语句if

选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。因此,在编写选择语句之前,应该首先明确判断条件是什么,并确定当判断结果为“真”或“假”时应分别执行什么样的操作/算法。在Java语言中选择语句主要提供了两个,一个是if语句,另一个则是switch语句,我们先来看if语句。

if语句的编写方式我归纳为以下四种,请看下图:

图6-1:if语句语法格式

if语句是非常简单容易理解的,if被翻译为如果,else被翻译为其它,我们针对以上第二种写法进行说明:如果布尔表达式的结果是“真”,则执行它后面的分支,反之则执行else对应的分支。好比说“如果外面下雨了(真),出门则拿一把雨伞,反之则不带雨伞”。再比如“如果你吃饱了(真)就不需要再吃了,反之则需要继续吃东西”。那么以上两个业务用代码应该如何实现呢?请看下面程序:


  
  1. boolean raining = false;
  2. if(raining){
  3. System.out. println( "外面下雨了,出门记得带一把伞哦!");
  4. } else{
  5. System.out. println( "天气不错哦!");
  6. }
  7. boolean eatFull = true;
  8. if(eatFull){
  9. System.out. println( "吃的好饱啊!");
  10. } else{
  11. System.out. println( "还没有吃饱,再来份米饭!");
  12. }

上图中第一种写法对应的原理图:

图6-2:6-1图中第一种写法对应的原理图

上图中第二种写法对应的原理图:

 

图6-3:6-1图中第二种写法对应的原理图

上图中第三种写法对应的原理图:

图6-4:6-1图中第三种写法对应的原理图

上图中第四种写法对应的原理图:

图6-5:6-1图中第四种写法对应的原理图

通过以上原理的分析,我们可以得出if语句的任何一种形式在执行的时候只要有一个分支执行,则所对应的整个if语句就全部结束了,换句话说,对于一个独立的完整的if语句来说,最多只能有一个分支执行。

另外,我们可以得出“图6-1”中的四种写法,其中第二种和第四种都带有else分支,所以这两种写法我们可以确保肯定会有一个分支执行,另外两种写法则无法保证,也就是说第一种和第三种这两种写法可能一个分支都不会执行,这两种写法的分支是否执行取决于条件是否为true。

还有,Java语言中有这样一条规定:当分支中只有一条java语句话,大括号可以省略不写,如以下程序:


  
  1. boolean sex = true;
  2. if(sex){
  3. System.out. println( "男");
  4. } else{
  5. System.out. println( "女");
  6. }
  7. //也可以这样写
  8. if(sex)
  9. System.out. println( "男");
  10. else
  11. System.out. println( "女");

虽然大括号可以省略,但是大家编写程序的时候一定要小心,分析以下程序错在哪里?


  
  1. if(sex)
  2. System.out. println( "男");
  3. System.out. println( "hello world!");
  4. else
  5. System.out. println( "女");

显然if是没有任何问题的,输出“男”也是没问题的,输出“hello world!”也是正常的,只不过负责输出“hello world!”的那一行代码不在if语句的分支当中,那么下面的else则缺少了if语句而编译报错。换句话说,else以上的代码都没有问题,错误出现在else缺少了if。

虽然java规定当分支中只有一条java语句的话大括号可以省略,但是为了程序具有很强的可读性,所以建议在实际开发中还是不要省略大括号会比较好。

那么,接下来我们给大家列举几个if语句的案例,帮助大家更好的理解和运用if语句。

示例代码1:业务背景:根据用户输入不同的数字来判断用户不同性别,当输入1时性别为男,当输入0时性别为女,输入其它则不合法。


  
  1. java.util.Scanner scan = new java.util.Scanner(System.in);
  2. System.out. print( "请输入数字:");
  3. int i = scan.nextInt();
  4. if(i == 1){
  5. System.out. println( "性别:男");
  6. } else if(i == 0){
  7. System.out. println( "性别:女");
  8. } else{
  9. System.out. println( "对不起,您输入不合法!");
  10. }

示例代码2:业务背景:键盘接收一个学生的成绩,范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”,输入其它数字表示成绩不合法。


  
  1. java.util.Scanner scan = new java.util.Scanner(System.in);
  2. System.out. print( "输入考试成绩:");
  3. int score = scan.nextInt();
  4. if(score < 0 || score > 100){
  5. System.out. println( "对不起,您输入的成绩不合法!");
  6. } else if(score >= 90 && score <= 100){
  7. System.out. println( "成绩等级:优秀");
  8. } else if(score < 90 && score >= 80){
  9. System.out. println( "成绩等级:良好");
  10. } else if(score < 80 && score >= 70){
  11. System.out. println( "成绩等级:中等");
  12. } else if(score < 70 && score >= 60){
  13. System.out. println( "成绩等级:及格");
  14. } else if(score < 60 && score >= 0){
  15. System.out. println( "成绩等级:大笨蛋");
  16. }

对于初学者来说以上程序是可以的,但是对于老程序员来说,以上的代码就太冗余了,我们将其进行优化,看以下代码:


  
  1. java.util.Scanner scan = new java.util.Scanner(System.in);
  2. System.out. print( "输入考试成绩:");
  3. int score = scan.nextInt();
  4. String grade = "大笨蛋";
  5. if(score < 0 || score > 100){
  6. grade = "对不起,您输入的成绩不合法!";
  7. } else if(score >= 90){
  8. grade = "优秀";
  9. } else if(score >= 80){
  10. grade = "良好";
  11. } else if(score >= 70){
  12. grade = "中等";
  13. } else if(score >= 60){
  14. grade = "及格";
  15. }
  16. System.out. println( "成绩等级:" + grade);

通过以上程序我们可以了解到一个功能的实现代码有多种编写形式,大家在学习的时候千万别机械性的一行一行对抄代码,实际上这种学习方法是非常痛苦,并且低效的,软件开发主要培养的是编程思想/编程思路,使用编程的思路解决现实生活中的问题。当然,对于初学者来说我们不可能刚开始就写出简单而高效的程序,这需要不断的模仿,不断的积累,尤其我们可以多参考高手写的程序(例如:JDK源代码),当你的代码达到一定量的时候,你就可以出山了。

示例代码3:业务背景:系统首先接收天气参数,1表示下雨天,0表示晴天,如果天气是晴天,输出“走起,一起出去玩耍喽!”,当天气是下雨天,则继续接收性别参数,1表示男,0表示女,当性别为女,则拿一把小花伞出去玩,当性别为男,则拿一把大黑伞出去玩。


  
  1. java.util.Scanner scann = new java.util.Scanner(System.in);
  2. System.out. print( "请输入天气指数,1表示下雨天,0表示晴天:");
  3. int weather = scann.nextInt();
  4. if(weather == 1){
  5. System.out. print( "请再输入您的性别,1表示男,0表示女:");
  6. int sex = scann.nextInt();
  7. if(sex == 0){
  8. System.out. println( "女士,外面下雨了,您需要带一把小花伞");
  9. } else if(sex == 1){
  10. System.out. println( "哥们,外面下雨了,您需要带一把大黑伞");
  11. } else{
  12. System.out. println( "对不起,您输入性别参数出错了!");
  13. }
  14. } else if(weather == 0){
  15. System.out. println( "走起,一起出去玩耍喽!");
  16. } else{
  17. System.out. println( "对不起,您输入天气参数出错了!");
  18. }

运行结果如下图所示:

图6-6:if语句嵌套演示

通过以上的程序我们得知,if语句是可以进行嵌套使用的,也就是说if语句的某个分支当中还可以继续编写其它if语句。实际上所有的控制语句都是可以进行嵌套使用的。语句嵌套这个知识点本来是不需要拿来进行特殊强调的,专门强调之后反而会让初学者特殊对待,我希望大家不要特殊对待嵌套。虽然被嵌套的是一个控制语句,但这个控制语句也是一段普通的java程序,你说呢!如下图:

图6-7:控制语句嵌套

总之,选择语句之if语句,在实际开发中使用频率非常高,大家一定要掌握if语句的编写方式以及运行原理,也可以自己想一些现实生活中的小例子加以练习。 

Java switch选择语句

switch语句和if语句一样,都属于选择语句(分支语句),不再赘述,我们直接来看一下一个比较完整的switch语句结构是怎样的,请看下图:

图6-8:switch语句完整结构

switch运行原理是怎样的呢,请看下图:

图6-9:switch语句运行原理图

switch运行原理文字性描述是这样的(以上图为例):拿着c和表达式1进行比较,如果相等,则执行语句1,如果不相等,继续拿着c和表达式2进行比较,如果相等,则执行语句2,如果不相等,继续...,如果c和所有的分支表达式都不相等,此时default分支“语句n+1”则执行。

以上描述是switch语句的一般性执行流程,实际上在执行过程中还有很多因素的影响,接下来我将列出使用switch语句的一些注意事项:

● switch语句后面的小括号“()”当中都可以出现什么,在JDK1.6之前(包括1.6在内)switch只能探测int类型的数据,但是在JDK1.7之后(包括1.7在内),switch语句除了支持int类型之外,还支持String类型。也就是说从Java7开始switch后面小括号中可以出现字符串。

● switch虽然只能探测int类型,但是也可以将byte,short,char类型放到小括号当中,因为这些类型会自动转换成int类型(小容量向大容量转换称为自动类型转换)。

● switch语句当中case是可以进行合并的,例如以下代码:


  
  1. switch( 90){
  2. case 100 : case 90 : case 80 : case 70 :
  3. System.out. println( "过关了");
  4. break;
  5. case 60:
  6. System.out. println( "失败了");
  7. break;
  8. default :
  9. System.out. println( "出错了");
  10. }

● switch语句当中当某个分支匹配成功,则开始执行此分支当中的java语句,当遇到当前分支中的“break;”语句,switch语句就结束了,但是如果当前分支中没有“break;”语句,则会发生case穿透现象,也就是说下一个分支也不再进行匹配,直接进入下一个分支执行,直到遇到“break;”为止。例如以下代码:


  
  1. char c = 'A';
  2. switch(c){
  3. case 'A' :
  4. System. out.println( 1);
  5. case 'B' :
  6. System. out.println( 2);
  7. break;
  8. default :
  9. System. out.println( 3);
  10. }

执行结果如下所示:

图6-10:switch的case穿透测试

接下来我们来看几个switch的经典案例,请看代码:

示例代码1:从键盘接收一个数字[1-7],当数字是1~5的时候,控制台输出工作日,当数字是6~7的时候,控制台输出休息日,其他数字提示错误信息。


  
  1. java.util.Scanner scan = new java.util.Scanner(System.in);
  2. System.out. print( "请输入[1-7]的整数数字:");
  3. int dayOfWeek = scan.nextInt();
  4. switch(dayOfWeek){
  5. case 1: case 2: case 3: case 4: case 5:
  6. System.out. println( "今天是工作日哦!");
  7. break;
  8. case 6: case 7:
  9. System.out. println( "今天是休息日哦!");
  10. break;
  11. default :
  12. System.out. println( "对不起,您的输入有误");
  13. }

示例代码2:业务背景:键盘接收一个学生的成绩(假设成绩是合法的),范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”。只允许使用switch,不允许使用if语句。


  
  1. java.util.Scanner scan = new java.util.Scanner(System.in);
  2. System.out. print( "请输入考试成绩[0-100]:");
  3. double score = scan.nextDouble();
  4. String grade = "大笨蛋";
  5. switch(( int)(score / 10)){
  6. case 10: case 9:
  7. grade = "优秀";
  8. break;
  9. case 8:
  10. grade = "良好";
  11. break;
  12. case 7:
  13. grade = "中等";
  14. break;
  15. case 6:
  16. grade = "及格";
  17. break;
  18. }
  19. System.out.println( "成绩等级为:" + grade);

运行结果如下图所示:

图6-11:switch判断成绩等级

图6-12:switch判断成绩等级

以上程序在编写时候的核心技巧是:[90-100]分的所有数字,包括浮点型数字,让其除以10之后强转为int类型,结果一定是9或者10。[80-90)分的所有数字,除以10之后取整,结果一定是8,以此类推。没关系同学们,大家在起初学习的时候不一定会马上写出来以上程序,这个过程是需要积累的,下去之后先自己模仿我的程序,慢慢的你就会写了。

if和switch都是条件判断语句(分支语句/选择语句),在效果上是没有什么差别的。而不同,我们可以从效率上来看一看,举一个很简单的例子: if(a > b) { a = b;} else { b = a; } 如果将这个例子放在switch语句中,也并不是不能实现,但是实现起来可能会比较麻烦一些,因为在switch语句中case要求的是常量,一般是不能进行逻辑判断的,所以这也是if语句优于switch语句的地方。但是如果您判断的都是几个常量的数据,我建议您最好采用switch语句,虽然if语句也是能实现的,但是性能就比switch差的有点远了。

 


转载:https://blog.csdn.net/bjpowernode_com/article/details/109569096
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场