欢迎光临散文网 会员登陆 & 注册

Java零基础快速入门|控制语句(下)

2021-02-02 14:03 作者:动力节点小王本王  | 我要投稿


本篇文章主要内容:

循环语句

for

while

do...while

转向语句

break

continue

循环语句

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,取决于循环的终止条件。

循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。

为了帮助大家理解循环语句存在的意义,我们来看一段代码:

 以上程序的业务背景是:输出100 行“hello world!”,如果我们像以上方式进行代码编写的话,代码将无法得到重复使用,大家也可以看到“System.out.println("hello  world!")”这行代码重复出现,直到输出100 个为止。显然程序应该找一种更好的实现方式,这个时候我们就可以借助java 语言中的循环语句来实现了。

Java中的循环语句共包括三个,分别是:for 循环、while 循环、do..while 循环。


for

接下来我们先来学习for 循环。for 循环的语法格式如下图所示:

 

for 循环语法结构

对以上 for 循环语法结构进行说明:初始化表达式最先执行,并且在整个循环当中初始化表达式只执行一次,布尔表达式结果是 true 或者 falsetrue 表示循环可以继续执行,false 示循环结束,循环体当中的代码就是需要反复执行的代码,更新表达式一般是用来更新某个变量的值,更新操作之后可能布尔表达式的结果就不再是 true 了。

那么 for 循环的执行顺序以及原理如下图所示:

for 循环语句执行顺序及原理

对于 for  循环来说,初始化表达式、布尔表达式、更新表达式都不是必须的,当布尔表达式缺失的时候,没有条件控制的前提下,会形成死循环,我们来看一下最简单的 for 循环形式:

执行结果如下图所示:

死循环输出结果

最常见的for 循环是怎样的呢?看以下代码:

运行结果如下图所示:

for 循环输出 1~10

对以上代码进行分析:首先执行int i = 1,并且只执行一次,定义初始化变量i,赋值1然后判断i <= 10 结果为true,则执行循环体打印 i = 1,循环体结束之后,执行 i++,然后 i 成了 2,继续判断 i <= 10 结果为true,则执行循环体打印 i = 2,如此循环执行,直到打印i = 10 之后,再执行 i++i 变成了11,然后判断 i <= 10 结果为false,循环结束,这样就完成了1~10 的输出,当然程序不是固定的,大家也可以把条件i <= 10 修改为i < 11,这样也是可以的。

关于for 循环的使用我们还需要注意初始化变量的作用域,在for 循环当中声明的变量只在for 循环中有效,当 for 循环结束之后,初始化变量的内存就释放了/消失了,所以在 for 循环之外是无法访问该变量的,例如以下代码在编译的时候就会报错了:

 当然,这样写就不会报错了:

为什么这样写就可以了呢?那是因为 i 变量的作用域已经被扩大了,不再只是 for 循环中可以使用,for 循环之外也可以使用,换句话说,以上的for 循环结束之后i 变量的内存并不会被释放。后续的程序可以继续使用。

i 变量的作用域是在整个 test()方法中都有效,直到 test()方法执行结束的时候才会释放i 变量的内存空间。接下来我们再来看看for 循环还有哪些其它的写法:

以上程序运行结果,请看下图:

for 循环的其它编写方式执行结果

接下来,我们再使用for 循环实现1~100 所有数字的求和,实现思路是:定义变量 i,初始值从 1 开始,每循环一次加1,这样就可以取到1~100 的每一个整数了,那么求和怎么做呢?

求和就是将 1~100 的每一个整数累加,这必然需要提前定义一个变量,使用变量实现累加,例如:a += 1a += 2a += 3...,代码如下所示:

运行结果如下所示:

1~100 所有整数求和

通过以上程序我们可以学到什么?

编程语言当中的累加可以使用扩展类赋值运算符+=实现,另外 sum 变量为什么定义到for 循环外面,而不是定义到循环体当中呢?

那是因为当定义到循环体内之后,每一次循环体在执行的时候,都会重新定义sum 变量,这样会让sum 量归 0,无法达到累加的效果。

接下来,我们在以上程序的基础之上实现1~100 所有奇数的和,编程思路是:在累加之前先判断变量i 是否为奇数,如果是奇数则累加,这就需要在sum += i 外面套一个 if 语句进行控制,代码如下所示:

运行结果如下所示:

1~100 所有奇数和的执行结果

其实以上的方式是将每一个数字取出来,然后再判断是否为奇数,这种方式会导致循环次数达到100 次,实际上可以换成另外一种解决方案,假设从 1 开始,每次累加2,那么每次取出的数字为 1,3,5...,这样正好每次取出的数字都是奇数,可以直接累加了,这样循环的次数基本上会减半,效率则提高了,这种代码既优雅,又高效。请看以下代码:

运行结果如下所示:

1~100 所有奇数和的执行结果

以上演示的所有循环都是单层的,循环当中可以嵌套循环吗?

答案是:当然可以,之前我们就说过所有控制语句都是可以嵌套使用的,当循环A 中嵌套循环B 的时候就等于在A 循环体中的代码是B 循环。

其实大家在学习循环嵌套的时候完全没必要特殊化对待,完全可以把 A 循环体当中的B 循环看做是一段普通的Java代码。接下来我们看一段代码:

运行结果如下图所示:

for 循环嵌套

分析以上for 循环嵌套,请看下图:

for 循环嵌套分析

分析循环嵌套的小窍门,如下图所示:

for 循环嵌套小窍门

学习了 for 循环嵌套的使用,我们一起来写一下经典的九九乘法表,九九乘法表的结构大家还记得吗,我们一起来回顾一下小学的知识嘿嘿):

九九乘法表结构

通过观察九九乘法表结构我们可以看出来它有9 行,所以可以得出一定需要以下代码:

运行结果如下:

九九乘法表 9 行

观察上图我们可以得出i 是行号,那么再次观察九九乘法表的规律得知,第 1 1 个式子,

2 2 个式子,第 3 3 个式子...,第 9 9 个式子,那么结论是第i 行有i 个式子,以上

循环确定为外层循环,共循环 9 次,外层循环每循环一次要保证能够输出九九乘法表的1 整行。

那么输出九九乘法表 1 整行的时候又需要一个循环进行控制,而且这个循环被放到内部,循环的次数随着行号的变化而变化。代码如下所示:

运行结果如下所示:

九九乘法表每个表达式的执行结果

分析以上代码,请看下图:

分析九九乘法表程序

 接下来我们在每一个“结果”前添加“i * j = ”,代码如下所示:

运行结果如下所示:

九九乘法表运行结果

通过以上代码的学习,需要每位读者能够掌握什么是循环,为什么要使用循环,for 循环的语法结构是什么,for 循环的执行顺序以及原理是什么,嵌套的 for 循环又应该怎么理解,大家也可以挑战一下三层 for 循环嵌套,或者更多。总之 for 循环在实际开发中使用非常频繁, 大家务必掌握。


while

循环语句除了for 循环之外还有while do..while,接下来我们先来看一下 while 循环,首先学习while 循环的语法结构,如下图所示:

while 循环语法结构

通过上图可以看出 while 循环的语法结构非常简单,它的执行顺序以及原理是这样的,先判断布尔表达式的结果,如果是true,则执行循环体,循环体结束之后,再次判断布尔表达式的结果,如果是true,再执行循环体,循环体结束之后,再判断布尔表达式的结果,直到结果false 的时候,while 循环结束。如果起初第一次判断布尔表达式结果的时候就是 false,那么while 循环体执行次数就为 0 了。它的执行顺序以及原理也可以参见下图:

while 循环执行顺序以及原理

 

通过 while 循环的执行原理可以得出while 循环的循环体执行次数可能是 0 次,也可能是 N

次。那么要想使用while 循环实现一个死循环,代码应该怎么写呢?

 运行结果就不再给大家展示了,要使用 while 实现一个死循环是非常简单的,让判断条件一直为true 就可以了。那么使用while 循环实现输出 1~10 应该怎么做呢?

运行结果如下图所示:

使用while 循环输出 1~10

其实使用while 循环输出 1~10 不止有以上这一种方式,还有其他方式,例如:

行结果如下图所示:

使用while 循环输出 1~10

当然,大家还可以想想有没有其它的写法,可以自己写一写,例如:

再如:

使用while 循环计算 1~100 所有偶数的和,应该怎么做呢?

运行结果如下图所示:

while 循环计算 1~100 所有偶数和

实际上 while 循环可以看做是 for 循环的另一种变形写法,本质上是一样的,执行效率上也是一样的,硬要说它们有什么不同的话,首先while 循环语法结构比for 更简单,for 循环的计数器比while 更清楚一些,另外 for 循环的计数器对应的变量可以在for 循环结束之后就释放掉,但是 while 循环的计数器对应的变量声明在 while 循环外面,扩大了该变量的作用域。总之,不管是for 还是while,大家都必须掌握,因为这两个循环使用最多。

 

do…while

do..while 循环是while 循环的变形,它们的区别在于 do..while  循环可以保证循环体执行次数至少为 1 次,也就是说 do..while 循环的循环体执行次数是 1~N 次,它有点儿先斩后奏的意思,而while 循环的循环体执行次数为 0~N 次。

为什么do..while 循环可以保证至少执行一次呢,它和while 循环的区别在哪里呢?

实际上是因为在开始执行while 循环的时候,最先执行的是条件判断,只有条件为true 的时候才会执行循环体,既然是这样,那么条件就有可能为 false,这个时候就会导致循环体执行次数为 0 次,俗话说,还没开始就结束了。而 do..while 循环最先执行的不是条件判断,它会先执行循环体,然后再进行条件判断,这样就可以保证循环体至少执行一次喽!

接下来我们一起来看看do..while 循环的语法结构,以及执行顺序,如下图所示:

do..while 语法结构和执行顺序

或者参见下图:

do..while 语法结构和执行顺序

上图中清晰的描述了do..while 循环执行顺序,这里就不再赘述,但需要注意的是 do..while 循环在最后的时候有一个半角的分号“;”,这个不能丢,丢掉之后编译器就报错了。接下来我们看一个do..while 循环的典型案例。

示例代码:业务背景:我们通常在使用的一个系统的时候需要登录,假设用户名或者密码记不清楚了,你是不是需要不断的“反复的”输入用户名和密码,这就是一个非常典型的循环案例,而这个循环当中首先要做的第一件事儿不是判断用户名和密码是否正确,它的起点是先让用户输入用户名和密码,所以这个时候我们就需要使用 do..while 循环来完成。请看以下代码:

运行效果如下图所示:

do..while 案例

解释以上程序:先提示用户输入用户名和密码,然后判断用户名和密码,当用户名不是admin 或者密码不是 123 的时候继续提示用户输入用户名和密码,直到用户输入的用户名是admin 并且密码是 123 的时候循环结束,循环结束之后输出登录成功的信息,只要循环没有结束就表示用户名和密码还是不对,当然,在现实的系统当中我们不可能允许用户无限制的输入用户名和密码,通常会给几次输入机会,当机会用完之后还是没有登录成功,通常该账户就被锁定了,你不妨试试这种业务又应该如何完成。

总之while do..while 循环的区别就在于do..while 会先执行一次循环体,然后再判断条件, 这样do..while 的循环体至少执行一次。而while 循环则是先判断条件是否合法,如果不合法, 则循环体就没有任何执行的机会。while 循环体执行次数是0~N 次,但是 do..while 循环体执行次数则是 1~N 次。

 

转向语句

转向语句用于实现循环执行过程中程序流程的跳转,在Java 中转向语句有break continue语句。当然,还包括其它的,例如return 语句,这里主要给大家说一下 break continue 语句。

 

break

使用break 这一个单词就可以在java 语言中自成一条java 语句,break 语句的编写很简单, 例如“break;”,那么它可以用在哪里呢?

首先它可以使用在switch 语句当中,用来终止 switch 语句的执行,这个之前我们用过,这里不再赘述,break语句重点是使用在循环语句当中,用来终止/跳出循环。

例如有这样一个业务:从键盘不断的接收用户输入的整数,只要用户输入的数字在[0~100]之间,则将输入的数字累加,一旦用户输入的整数不在[0-100]的范围,则终止循环的执行,并输出计算结果。请看下面的代码:

运行效果如下图所示:

break 初步使用

通过以上程序我们得知当用户输入的数字不在[0-100]范围内的时候 break 语句执行,while循环结束了。

那么,当循环语句多层嵌套的时候break 语句终止的是哪个循环呢?我们来看以下的程序:

运行结果如下所示:

break 终止的是哪个循环

分析以上程序,请看下图:

循环嵌套时,break 终止哪个?

通过上图的分析,可以得知break 语句默认情况下只能终止离它“最近”的“一层”循环。以上的 break 语句则终止的是内部循环,不影响外部循环的执行。

那么 break 语句可以用来终止指定的循环吗?请看以下代码:

运行结果如下图所示:

终止指定的循环

通过以上程序的测试,我们可以得知当多层循环嵌套的时候,可以给每个循环设置标识, 例如:first:for...second:for...,当某个条件成立时,想终止指定循环的话,可以这样做:break first;或者break second;,这样指定的循环就结束了。

总之,break 语句出现在循环当中用来终止循环的执行。例如:运动场上的运动员跑圈儿, 跑了一圈又一圈,这显然是循环机制,假设比赛要求跑10 圈儿,或者 20 圈儿,那么当计数器等于 10,或者20 的时候,循环就结束了,如果中途发生意外呢,例如运动员晕倒了,那么此时在没有达到10 圈儿或 20 圈儿的时候是不是也应该终止此循环的执行,要想让循环结束则执break 语句就可以了。

 

continue

continue 语句也是单个单词自成一条java 语句,例如“continue;”,它和 break 语句都是用来控制循环的,break 语句是用来终止循环的执行,而 continue 语句则是用来终止当前本次循环,直接进入下一次循环继续执行。

请参照以下代码以及运行结果进行对比学习:

运行结果如下图所示:

break 和continue 对比

对以上代码以及执行结果进行分析,请看下图:

break 和continue 对比

对于以上程序,当“continue;”语句执行的时候,当前本次循环剩下的代码就不再执行了

不再执行下面的输出语句),直接执行“i++”去了,而 break 就不同了,当以上程序“break;语句执行之后整个for 循环就结束了。

对于break 语句有“break first;”这种写法,其实continue 语句也是有这种语法机制的,这里就不再赘述了,大家可以自己编写程序测试一下。


对于 break continue 语句的区别有这样一个小的现实情景,大家可以借鉴理解一下:

公司销售部销售经理要进行人员招聘,预约了 10 个应聘者,这10 个应聘者在办公室门口长凳上按照一定的次序坐着等待,销售经理一个一个轮流进行面试,当轮到第3个应聘者面试的时候,销售经理突然接到了一通电话,说家里有事儿了,那么此时销售经理就不得不终止今天的面试,此时销售经理执行了break 语句,循环结束了,剩下的就不再面试了。那么假设销售经理没有接到这通电话则会继续轮流面试,他为每一个应聘者准备了 5 个问题,假设轮到第 6

个应聘者面试,在面试过程中问完第1个问题之后销售经理就知道这人不适合这个岗位,那么

此时剩下的 4 个问题就不再问了当前本次循环结束,直接对着门口喊了一句:下一个应聘的进来。这个过程就相当于销售经理执行了continue 语句。

总之,break 用来终止循环,continue 用来中断当前本次循环,直接进入下一次循环继续执行。

 

难点解惑

本章节内容虽然很重要,但是每一个都不是很复杂,比较容易掌握,如果难点,对于初学者来说switch 语句也不是那么容易掌握的。请看以下代码:

我们来分析一下以上程序,首先语法上没有错误,可以编译通过,有人可能认为 default 还可以写在这个位置?是的,default 可以写在任何位置,但它的执行时机是不变的,永远都是在所有分支都没有匹配成功的时候才会执行,对于以上程序来说 default 分支是不会执行的, 因为y 最初等于3,与第一个分支会匹配成功。当第一个分支匹配成功之后,执行 y++,此时y 等于 4。由于没有 break 语句,会发生 case 穿透现象,继续执行第二个分支 y++y 的值最终5

我们对以上程序进行编译和运行,来看一下我们的分析是否是正确的,请看下图:

Test 程序的编译和运行

通过以上的测试结果,可以看出,我们的分析是正确的。


小结

本章节内容在以后的开发中会经常的使用,因为软件很多时候都需要处理业务逻辑,那么处理逻辑的过程是需要控制语句来完成的,所以本章节内容非常重要。

本章节中所讲到的控制语句都很常用,如果要说哪些使用频率最高,其中 if 语句、for 循环、while 循环使用最为频繁。对于这几个语句大家可以着重掌握。


最后附Java零基础视频教程给大家,配合学习效果更佳!!







Java零基础快速入门|控制语句(下)的评论 (共 条)

分享到微博请遵守国家法律