本章节目标:
记住所有控制语句的语法格式,理解不同的控制语句分别在哪些不同的情况下使用,并且能够熟练编写这些控制语句。
知识框架:
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对应的分支。好比说“如果外面下雨了(真),出门则拿一把雨伞,反之则不带雨伞”。再比如“如果你吃饱了(真)就不需要再吃了,反之则需要继续吃东西”。那么以上两个业务用代码应该如何实现呢?请看下面程序:
-
boolean raining =
false;
-
if(raining){
-
System.out.
println(
"外面下雨了,出门记得带一把伞哦!");
-
}
else{
-
System.out.
println(
"天气不错哦!");
-
}
-
boolean eatFull =
true;
-
if(eatFull){
-
System.out.
println(
"吃的好饱啊!");
-
}
else{
-
System.out.
println(
"还没有吃饱,再来份米饭!");
-
}
上图中第一种写法对应的原理图:
图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语句话,大括号可以省略不写,如以下程序:
-
boolean sex =
true;
-
if(sex){
-
System.out.
println(
"男");
-
}
else{
-
System.out.
println(
"女");
-
}
-
//也可以这样写
-
if(sex)
-
System.out.
println(
"男");
-
else
-
System.out.
println(
"女");
虽然大括号可以省略,但是大家编写程序的时候一定要小心,分析以下程序错在哪里?
-
if(sex)
-
System.out.
println(
"男");
-
System.out.
println(
"hello world!");
-
else
-
System.out.
println(
"女");
显然if是没有任何问题的,输出“男”也是没问题的,输出“hello world!”也是正常的,只不过负责输出“hello world!”的那一行代码不在if语句的分支当中,那么下面的else则缺少了if语句而编译报错。换句话说,else以上的代码都没有问题,错误出现在else缺少了if。
虽然java规定当分支中只有一条java语句的话大括号可以省略,但是为了程序具有很强的可读性,所以建议在实际开发中还是不要省略大括号会比较好。
那么,接下来我们给大家列举几个if语句的案例,帮助大家更好的理解和运用if语句。
示例代码1:业务背景:根据用户输入不同的数字来判断用户不同性别,当输入1时性别为男,当输入0时性别为女,输入其它则不合法。
-
java.util.Scanner scan =
new java.util.Scanner(System.in);
-
System.out.
print(
"请输入数字:");
-
int i = scan.nextInt();
-
if(i ==
1){
-
System.out.
println(
"性别:男");
-
}
else
if(i ==
0){
-
System.out.
println(
"性别:女");
-
}
else{
-
System.out.
println(
"对不起,您输入不合法!");
-
}
示例代码2:业务背景:键盘接收一个学生的成绩,范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”,输入其它数字表示成绩不合法。
-
java.util.Scanner scan =
new java.util.Scanner(System.in);
-
System.out.
print(
"输入考试成绩:");
-
int score = scan.nextInt();
-
if(score <
0 || score >
100){
-
System.out.
println(
"对不起,您输入的成绩不合法!");
-
}
else
if(score >=
90 && score <=
100){
-
System.out.
println(
"成绩等级:优秀");
-
}
else
if(score <
90 && score >=
80){
-
System.out.
println(
"成绩等级:良好");
-
}
else
if(score <
80 && score >=
70){
-
System.out.
println(
"成绩等级:中等");
-
}
else
if(score <
70 && score >=
60){
-
System.out.
println(
"成绩等级:及格");
-
}
else
if(score <
60 && score >=
0){
-
System.out.
println(
"成绩等级:大笨蛋");
-
}
对于初学者来说以上程序是可以的,但是对于老程序员来说,以上的代码就太冗余了,我们将其进行优化,看以下代码:
-
java.util.Scanner scan =
new java.util.Scanner(System.in);
-
System.out.
print(
"输入考试成绩:");
-
int score = scan.nextInt();
-
String grade =
"大笨蛋";
-
if(score <
0 || score >
100){
-
grade =
"对不起,您输入的成绩不合法!";
-
}
else
if(score >=
90){
-
grade =
"优秀";
-
}
else
if(score >=
80){
-
grade =
"良好";
-
}
else
if(score >=
70){
-
grade =
"中等";
-
}
else
if(score >=
60){
-
grade =
"及格";
-
}
-
System.out.
println(
"成绩等级:" + grade);
通过以上程序我们可以了解到一个功能的实现代码有多种编写形式,大家在学习的时候千万别机械性的一行一行对抄代码,实际上这种学习方法是非常痛苦,并且低效的,软件开发主要培养的是编程思想/编程思路,使用编程的思路解决现实生活中的问题。当然,对于初学者来说我们不可能刚开始就写出简单而高效的程序,这需要不断的模仿,不断的积累,尤其我们可以多参考高手写的程序(例如:JDK源代码),当你的代码达到一定量的时候,你就可以出山了。
示例代码3:业务背景:系统首先接收天气参数,1表示下雨天,0表示晴天,如果天气是晴天,输出“走起,一起出去玩耍喽!”,当天气是下雨天,则继续接收性别参数,1表示男,0表示女,当性别为女,则拿一把小花伞出去玩,当性别为男,则拿一把大黑伞出去玩。
-
java.util.Scanner scann =
new java.util.Scanner(System.in);
-
System.out.
print(
"请输入天气指数,1表示下雨天,0表示晴天:");
-
int weather = scann.nextInt();
-
if(weather ==
1){
-
System.out.
print(
"请再输入您的性别,1表示男,0表示女:");
-
int sex = scann.nextInt();
-
if(sex ==
0){
-
System.out.
println(
"女士,外面下雨了,您需要带一把小花伞");
-
}
else
if(sex ==
1){
-
System.out.
println(
"哥们,外面下雨了,您需要带一把大黑伞");
-
}
else{
-
System.out.
println(
"对不起,您输入性别参数出错了!");
-
}
-
}
else
if(weather ==
0){
-
System.out.
println(
"走起,一起出去玩耍喽!");
-
}
else{
-
System.out.
println(
"对不起,您输入天气参数出错了!");
-
}
运行结果如下图所示:
图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是可以进行合并的,例如以下代码:
-
switch(
90){
-
case
100 :
case
90 :
case
80 :
case
70 :
-
System.out.
println(
"过关了");
-
break;
-
case
60:
-
System.out.
println(
"失败了");
-
break;
-
default :
-
System.out.
println(
"出错了");
-
}
● switch语句当中当某个分支匹配成功,则开始执行此分支当中的java语句,当遇到当前分支中的“break;”语句,switch语句就结束了,但是如果当前分支中没有“break;”语句,则会发生case穿透现象,也就是说下一个分支也不再进行匹配,直接进入下一个分支执行,直到遇到“break;”为止。例如以下代码:
-
char c =
'A';
-
switch(c){
-
case
'A' :
-
System.
out.println(
1);
-
case
'B' :
-
System.
out.println(
2);
-
break;
-
default :
-
System.
out.println(
3);
-
}
执行结果如下所示:
图6-10:switch的case穿透测试
接下来我们来看几个switch的经典案例,请看代码:
示例代码1:从键盘接收一个数字[1-7],当数字是1~5的时候,控制台输出工作日,当数字是6~7的时候,控制台输出休息日,其他数字提示错误信息。
-
java.util.Scanner scan =
new java.util.Scanner(System.in);
-
System.out.
print(
"请输入[1-7]的整数数字:");
-
int dayOfWeek = scan.nextInt();
-
switch(dayOfWeek){
-
case
1:
case
2:
case
3:
case
4:
case
5:
-
System.out.
println(
"今天是工作日哦!");
-
break;
-
case
6:
case
7:
-
System.out.
println(
"今天是休息日哦!");
-
break;
-
default :
-
System.out.
println(
"对不起,您的输入有误");
-
}
示例代码2:业务背景:键盘接收一个学生的成绩(假设成绩是合法的),范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”。只允许使用switch,不允许使用if语句。
-
java.util.Scanner scan =
new java.util.Scanner(System.in);
-
System.out.
print(
"请输入考试成绩[0-100]:");
-
double score = scan.nextDouble();
-
String grade =
"大笨蛋";
-
switch((
int)(score /
10)){
-
case
10:
case
9:
-
grade =
"优秀";
-
break;
-
case
8:
-
grade =
"良好";
-
break;
-
case
7:
-
grade =
"中等";
-
break;
-
case
6:
-
grade =
"及格";
-
break;
-
}
-
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