带你从零学Java
大家好,我是周同学~
持续更新Java入门系列教程:
Java基础 | Java运行环境JDK的配置
Java基础 | 基本语法格式
Java基础 | 基本数据类型与其类型转换
Java基础 | Java运算符
Java基础 | 位运算符
JAVA基础 | 流程控制语句-分支结构
零.前言
上一篇文章中给大家介绍了Java语言的分支结构,并给大家简单的介绍了if语句和switch语句容易造成的逻辑错误。
提前说明:教程比较小白,大佬不喜勿喷,欢迎评论提建议。
这篇文章将带着大家学习另一种流程控制语句–循环结构。循环结构就是根据某一循环条件重复执行语句,这段被重复执行的代码被称为循环体。在反复执行循环体时,需要在合适的时候将循环条件改为false,否则循环将一直执行下去,形成死循环。
循环语句一共包括四个部分:
初始化语句:一条或者多条语句,用于完成初始化工作,一般在循环开始之前执行。
循环条件:这是一个boolean表达式,这个表达式能决定是否执行循环体。
循环体:这个部分是整个循环结构的主体部分,如果循环条件为true,这个代码块将反复执行。
迭代语句:这个部分在每次循环体执行结束之后、对循环条件求值之前执行。一般用于控制循环条件中的变量,使得循环在合适的时候结束。
上面四个部分只是一般情况下的分类,但并不是每个循环中都清晰的分出了这四个部分。下面将给大家介绍三种循环结构和两个循环控制语句。
一.while循环语句
while循环的基本格式如下:
[初始化条件]while(循环条件){循环体;[迭代语句]}
上面的基本格式中,带方括号的部分,代表可有可无;可以看到迭代语句在循环体的后面,因此只有循环体能成功执行完成时,迭代语句才会被执行。
下面示范一个简单的while循环:
上面循环语句的意思是:当count<10的时候,打印输出count,每输出一次,就将count的值 1,知道count的值为10,停止循环。
需要注意的是,如果迭代语句被整合到循环条件的表达式中,或者循环体只有一个语句,而且迭代语句被整合到循环体中。这时,花括号也可以省略掉,如下两种情况:
大家可以结合之前讲过的自增自减运算符的规则来分析一下为什么上下两种写法为什么都是循环10次,但输出结果不同。当然,和分支结构一样,不管可以整合的多么简单,我还是不建议大家省略花括号。
还有一个新手经常犯的错误,要特别注意while循环的小括号后面不要加分号,例如下面的写法(这是错误写法,不要学习~):
因为有些读者可能学过C语言或者C 语言,很多时候左侧花括号是独占一行书写,我个人之前也是这种习惯,导致写while小括号之后,习惯性的加上了分号。虽然看起来没什么错误,程序也不会直接报错,但是我们要注意的是,一个分号代表着一个语句的结束,上面代码的写法与下面的写法是相同的:
下面的花括号就不是循环结构中的部分了,而是单独的代码块。所以希望大家在写代码的时候也多加注意。
二.do…while循环
do…while循环和while循环类似,代码格式如下:
[初始化条件]do{ 循环体; [迭代条件]}while(循环条件);
do…while循环和while循环基本上一样,只不过while循环先进行条件判断,再执行循环体和迭代语句;do…while循环先执行循环体和迭代语句,再进行条件判断。也就是说,do…while循环的循环体至少被执行一次。也要注意的一点是,do…while循环的条件判断之后需要加上分号。下面是一个do…while循环的简单实例:
可以看到do…while循环和while循环是非常类似的。可以根据上面while循环的几种写法,自己试试改成do…while循环。
三.for循环
for循环与上面两种循环相比是更为简洁的循环语句。大部分情况下for循环是可以替代while循环和do…while循环的。
for循环的基本语法格式如下:
for([初始化语句];[循环条件];[迭代语句]){循环体;}
程序在执行for循环时,先执行初始化语句,且初始化语句在整个for循环中只会被执行这一次;每次执行循环体之前,先进行循环条件的判断,如果循环条件为true则执行循环体,否则结束循环;而迭代语句是在循环体结束,或者使用continue跳过本次循环之后执行。
值得注意的是,for循环的循环条件也是可以省略的,也就是说for循环可以写成:
for(;;){循环体;}
这将形成一个死循环,除非在循环体中加上一定条件使其break跳出循环。
下面展示一个for循环的基本写法:
可以看到相对于上面两个循环结构,for循环的结构更加简便。要注意的是,for循环中初始化条件可以直接声明变量并赋值,但是这个变量只能在循环体内部使用,属于局部变量。
如果我们想使用使用局部变量的值,我们可以在循环之前定义一个变量,例如下面的for循环求和代码:
相比于while循环和do…while循环,我个人更加喜欢使用for循环。当然使用而言循环是没有区别的,每一种循环都可以使用另外两种改写。
四.嵌套循环
如果把一个循环语句,放到另一个循环语句的循环体中,这就形成了嵌套循环。如果一个外层循环需要循环m次,内层循环每次循环n次,在整个循环结束的时候内层循环实际上执行了n*m次。
例如下面的代码:
上面的代码只是一个嵌套循环例子,在熟悉循环结构之后,也是可以简化成单层循环:
当然,既然能两层嵌套,当然也可多层嵌套,在这里不做演示。
五.控制循环语句
可能有些读者学C/C 语言的时候了解过goto这个语法,但在Java中并不支持这个语法。Java只提供了continue和break两种控制循环语句。除此之外,return语句会直接结束整个方法,当然也就直接结束了循环。
5.1.break语句结束循环
有些时候我们可能需要在某种条件出现时,强行结束循环。此时我们可以使用break来完成这个功能。break用于结束整个循环。例如下面的代码:
上面的代码会输出:1,2。到i等于3的时候便结束循环了。
我们要注意的是,break只会直接跳过break所在的那层循环,但是如果break在内层循环中,并不会结束外层循环,例如:
运行结果为:
可以看到并没有输出“ i == 2”的情况,但接着输出了“ i==3”的情况。但是Java中提供了一种标签,也可以作用于跳过外层循环,如下写法:
此时的代码只会输出“i==1”的情况。因为outer标签作用在外层循环上,break outer直接结束了外层循环,标签名称必须符合标识符命名规则。且必须在使用这个标签之前定义,如果没有定义或者其他情况,将默认结束当前所在的循环。switch是唯一能执行break的分支结构。
特别注意,标签只能定义在循环结构之前,且只能定义在外层循环上才有实际作用,作用在当前循环时为默认作用。不能作用在同层次的循环上。
5.2.continue结束本次循环
continue的作用与break有些类似,区别是continue只会结束本次循环,接着开始下一次循环;而break直接结束掉整个循环。注意,在for循环中执行continue之后仍然会执行迭代语句。下面是continue的实例代码:
上面代码会输出:1,3。直接跳过2。
与break一样,continue也可以使用标签,而且除了作用之外,与break的标签完全一样。所以不做过多讲解,希望大家自己多动手尝试。
5.3.return直接结束方法
return关键字并不是专门用来结束循环的,它的作用是结束整个方法,return语句后面还可以跟变量,常量和表达式(这些会在后面篇章中提到),此处只需要记住,在主方法中return后面只能加一个分号。
任何循环都是在方法中执行,所以return可以作用于方法中,当运行到return时,直接结束整个方法。例如下面的代码:
因为return是结束整个方法,所以当运行到return时,之后的语句全部不执行。
六.结尾