在讲解流程控制语句之前,我们先来说一下语句的问题。Java中的语句分为声明和赋值语句,条件和循环语句,调用和返回语句;我们之所以每两个放在一起是有深意的,我们大致将语句分为这三块,并以此为纲来说一下,重点在流程控制语句(条件和循环语句)。
程序就是由一系列的声明、赋值、条件、循环、调用和返回语句组成的。一般来说代码的结果都是嵌套的:一个条件或循环语句中也可以嵌套条件语句或循环语句。而一个函数中可以由若干各种语句组成,若干的函数组成类,正式这样的组合才形成了功能丰富的软件。下面我们从声明和赋值语句讲起;
1.1 声明与赋值语句
声明语句将一个变量名和一个类型在编译时关联起来。Java需要我们在声明语句的时候指定变量的名称和类型。这样我们才能清楚的明白能够对其进行的操作。Java是一种强类型语言,因为Java编译器会检查类型的一致性(例如,它不会允许boolean类型和浮点类型的变量相乘)。变量可以声明在第一次使用之前的任何地方,一般我们会在首次使用时声明它,变量的作用域就是定义它的地方(成员或局部),一般由相同代码段中声明之后的所有语句组成。
赋值语句(由一个表达式定义的)将某个数据类型的值(可以是具体值,也可以是一个引用)和一个变量关联起来。在Java中,我们进行赋值操作,我们表达的不是数学中的等于“=”,而是将一个地址与该变量名绑定,让该变量名指向这个内存地址。
package cn.assignment; public class Test { //声明语句由数据类型与变量名称构成,--这里的数据类型可以是基本数据类型,也可以是引用类型--对象 static int i; /*int ii; ii = 89;*///不允许在赋值语句声明完后再赋值,要在一起操作,但是可以成员声明,函数中进行赋值的操作 static int a1; public static void main(String[] args) { i = 23; System.out.println(i);//23 System.out.println(a1 = 90);//90 } }
我们在开发中往往建议将声明和赋值放在一起操作,即声明的同时给语句赋值。
1.2 调用和返回语句
我们对Java最大的印象只怕就在面向对象了,我们写的所有类的最大作用就是在于为有需要的类提供可供解决的方法。这就是调用的的思想。例如我们写一个加法的运算,那么以后凡是遇到加法的运算,那么就都可以通过调用这个方法来解决了,这就是调用的思想,而有些方法是具有返回值的,返回值的语句是返回语句;举例如下:
//简单的加法运算 public static int add(int a,int b){ return a+b;//返回语句 }
通过上面我们发现语句并不固定于单类型语句的使用,而是花样百出的嵌套,组合使用,这也是高级编程语言的灵活所在。在返回语句中我们发现有一个关键字return,这里我们不多做介绍,我们放在流程语句和continue和break一起介绍。
1.3 流程控制语句
了解完声明和赋值语句、调用和返回语句,那么我们就进入今天的重头戏--流程控制语句了,我们在本节中会叙述流程控制语句的功能,同时还会附以案例加强,最后会深入探讨流程控制语句。
做任何事情都要遵循一定的原则。例如,到图书馆去借书,就必须有借书证,并且借书证不能过期,这两个条件缺一不可。程序设计也是如此,需要有流程控制语言来实现与用户的交流,并根据用户的输入决定程序要“做什么”、“怎么做”等。
流程控制语言对于任何一门编程语言来说都是至关重要的,它提供了控制程序步骤的基本手段。如果没有流程控制语句,整个程序将按照线性的顺序来执行,不能根据用户的输入来决定执行的序列。我们大略的将流程控制语句分为以下这么几类,复合语句、条件语句、循环语句,下面我们将一一介绍。
1.3.1 复合语句
与C语言及其它语言相同,Java语言的复合语句是以整个区块为单位的语句,所以又称块语句。复合语句由开括号“{”开始,和闭括号“}”结束。在前面的学习中已经解触到了这种复合语句。例如在定义一个类或方法时,类体就是以“{}”作为开始与结束的标记,方法体同样也是以“{}”作为标记。对于复合语句中的每个语句都是从上到下的执行。复合语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,并且在复合语句中还可以嵌套复合语句。
在使用复合语句时要注意,复合语句为局部变量创建一个作用域,该作用域为程序的一部分,在该作用域中某个变量被创建并能够被使用,如果某个变量的作用域外使用该变量,则会发生错误。
【例5.1】创建CompoundStatementPractice类,进行复合语句的一些验证;
class CompoundStatementPractice{ public static void main(String[] args){ int a = 23 ; System.out.println("a的值是:"+a); { int b = 24 , c = 25 ; System.out.println("b的值是:"+b); boolean boo ; //我们一定要注意变量的作用域,也就是它的生命周期 { boo = b > c ; System.out.println("复合语句中的嵌套语句:"+boo); } // int a = 20 ; 如果在main方法中已经声明成员变量,复合语句中再次声明相同名字的成员变量会出现错误 a = a++ + 1 ; } //System.out.println("在变量的作用域外使用变量会出现错误:"+b); 会提示找不到符号 System.out.println("我们一定要注意变量的作用域,和语句的线性顺序:"+a); } }
1.3.2 条件语句
条件语句可根据不同的条件执行不同的语句。条件语句包括if条件语句和switch多分支语句。
1.3.2.1 if条件语句
If条件语句是一个重要的编程语句,它用于告诉程序在某个条件成立的情况下执行某段程序,而在另一种情况下执行另外的语句。
使用if条件语句,可选择是否要执行紧跟在条件之后的那个语句。关键字if之后是作为条件的“布尔表达式”,如果该表达式返回的结果是true,则执行其后的语句;若为false,则不执行if条件之后的语句。If条件语句可分为简单的if条件语句、if...else语句和if...else if多分支语句。
1.3.2.1.1 简单的if语句
语法格式如下:
if(布尔表达式){ 语句序列 }
- 布尔表达式:必要参数,表示它最后返回的结果必须是一个布尔值。它可以是一个单纯的布尔变量或常量,或者使用关系或布尔运算符的表达式。
- 语句序列:可选参数。可以是一条或多条语句,当表达式为true时执行这些语句。如果语句序列中仅含有一条语句,则可以省略条件表达语句中的大括号。如果我们自己编程时书写了大括号,同时语句序列中只有一条语句,那么编译器在编译时会自动帮我们去除大括号。
【例5.2】创建IfPractice类,进行简单if条件语句的练习
class IfPractice{ public static void main(String[] args){ int a = 23 , b = 24 ; boolean boo = true ,aoo = false ; if(! false == boo || (5 == 6)){ System.out.println("表达式的形式可以多样但其结果必须为boolean类型"); } if(5 == 6);{ System.out.println("如果if条件语句后即()后直接跟;则该条if简单语句语句无论是否成立都继续下面代码"); } if(a < b){ if( a < b){ System.out.println("If语句可以像复合语句一样嵌套语句!"); } System.out.println("简单if语句的标准形态;"); } if(aoo) System.out.println("简单if语句序列中若只有一条语句则可以省略{}这时并无语法错误,并且if语句的作用范围也可覆盖,但不支持,为了增强阅读性"); System.out.println("if语句若省略{},那么其作用范围只是紧随其后的一条语句,其他的语句会线性执行,不会受其表达式的影响!"); if(boo){}//当简单if语句序列中没有内容时可以省略{},末尾加;,当然也可以保留, if(a < b && boo){ System.out.println("简单if语句中的条件一定要是布尔表达式,也就是结果必须是布尔型,格式不限制"); } /*if(3 = 3){ System.out.println("我们一定要确定if语句条件表达式的数据类型,如上3是int型,结果也是int型,会爆出错误以外的类型"); }*/ } }
If语句注意点: a,每一种格式都是单条语句。 b,第二种格式与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中。 c,条件表达式无论写成什么样子,只看最终的结构是否是true 或者 false; D.if语句同复合语句一样可以嵌套语句 |
If语句流程运行图:
|
1.3.2.1.2 if...else语句
If....else语句和三元运算符的区别 |
If ....else语句的执行行程图 |
对于if...else语句可以使用三元运算符对语句进行简化,如下面的代码 if(a > 0) b = a ; else b = -a; 可以简化成: b = a>0?a:-a ;上面代码为求绝对值的语句,如果a > 0,就把a的值赋给b,否则将-a赋值给b。也就是“?”前面的表达式为真,则将问号和冒号之间的表达式的计算结果赋值给变量b,否则将冒号后面的计算结果赋值给b,使用三元运算符的好处是可以使代码简洁,并且有一个返回值。 |
图3.4 if...else语句的执行过程图 |
在第一种简单if语句中条件不成立时if语句不能给出任何反馈,这是出现了第二种if语句当条件表达式的结果为true则执行语句1,否则执行语句2.
注意事项:
A.else没有条件表达式
B.else必须和if组合使用,else不能单独使用会报错
C.一个if语句只能有一个else
else是可以省略的,当知道条件表达式成立时,可以省略else,这时就相当于1.1if语句
if语句和else联合使用时,if如果控制多行语句就一定要加{},否则出现B错误,这时情况为if语句+输出语句+else,B情况产生,如果if控制一行else控制一行时大括号能省,这时如果条件表达式为true则进行紧挨if语句的输出,反之输出else,当if控制一行else控制多行时如果条件表达式为true则进行紧挨if语句的输出,else中输出除去紧挨else的语句 反之else中输出,所以Java中不管什么情况不要省略{},避免错误
【例5.3】创建IfElsePractice类,并针对if....else的一些特性进行验证
class IfElsePractice{ public static void main(String[] args){ /*else{ System.out.println("else必须和if语句连用,不能单独使用,否则会错误,有‘if‘,但是没有‘else‘"); }*/ if(5 > 6){ System.out.println("我们可以看到简单if语句条件不成立时,if语句不能出现任何反馈,那么我们怎么知道是条件不成立还是程序错误呢,这时就出现了if...else语句"); } if(5 > 6){ System.out.println("为补充if语句而出现的if...else语句"); }else/*(5 < 6)*/{ System.out.println("if...else语句中else语句后不能有条件语句直接跟随{},如果跟随(),会发出错误,提示在()后加;"); }/*else{ System.out.println("一个if语句只能和一个else语句连用,否则会错误,有‘if‘,但是没有‘else‘"); }*/ if(5 < 6){ System.out.println("当if后面只控制一条语句时,可以省略{},它会直接输出,否则不支持,因为它只会输出紧跟他的一条"); }else{ System.out.println("当else后面只控制一条语句时,可以省略{},它会直接输出,否则不支持,因为它只会输出紧跟他的一条"); } /*if(5 > 6) System.out.println("{}省略"); 当if...else...语句中,if后边控制多条语句时,{}不可 以省略,否则会报错“有if没有else” System.out.println("{}省略"); else{ System.out.println("{}省略时,"); }*/ //嵌套语句在if...else语句中的应用 if(true){ if(false){ System.out.println("嵌套语句在if...else中的使用"); }else{ System.out.println("嵌套语句在if...else中的使用"); } }else{ System.out.println("嵌套语句在if...else中的使用"); } /*三元运算符和if...else语句的区别, If--else语句与三元运算符的区别:三元运算符运算完要有值出现。好处是:可以写在其他表达式中,而if----else语句则没有这种限制,但是可以写在其他方法中,不能写在表达式中*/ //求 a的绝对值和b的和 int a = 7 , b = 3 , sum ; if(a > 0){ System.out.println("您所求的两个数的和为:"+(a+b)); }else System.out.println("您所求的数的绝对值为:"+(-a+b)); sum = (a > 0 ? a : (-a))+b; System.out.println("您所求的两个数的和为:"+sum); } }
面试题:问下面一段代码是否会正常输出?
if(5 > 6) System.out.println("{}省略”); System.out.println("{}省略"); else{ System.out.println("{}省略时,"); }
答:不会,代码会出现错误,当代码判断条件语句不成立时,会自动跳过紧跟他的一条语句,这是它的作用范围,然后编译下一条代码,这时因为没有发现else,会将他认为是简单if语句,再往下执行时发现了else语句,这是编译会将其作为不合法代码跳出”错误:有’if’没有’else’”
1.3.2.1.3 if...else if语句
注意事项:
- A.else if必须和if组合使用,else if语句末尾可以(意味着非必须)是一条单独的else语句
- B.else不能有条件表达式
- C.我们if语句第三种格式,任何一个条件表达式成立,if语句直接结束.
【例5.4】创建IfElseIfPractice类,进行对IfElseIf语句的特性进行一些验证
class IfElseIfPractice{ public static void main(String[] args){ if(false){ System.out.println("1"); }else if(false){ System.out.println("2"); }else if(true){//当发现if条件语句为true时,只执行这条语句,其他的就不再执行, System.out.println("3");//跳出这个if..else..if语句,执行其他程序 }else if(true){ System.out.println("4"); }else{ System.out.println("5"); } } }
1.3.2.1.4 if条件语句练习
【例5.5】学生考试成绩出来了请对其进行划分等级,要求90--100 A等 80--89 B等 70--79 C等 60--69 D等 60分以下 叫家长,谈人生
分析:我们初看到这道题目时,要注意这么几点
- 考试成绩大于等于0小于等于100,所以我们要考虑输入错误的情况!
- 由于成绩是一个变量,所以这里我们需要一个变量来代表这个成绩
- 等级对于成绩来说是一个区间,并且这是一个条件语句,所以我们需要应用到比较运算符,和逻辑运算符。
- 由于我们在这里需要比较很多区间,所以我们需要考虑用哪种语句,在这里很明显选择第三种if语句
class GradePractice{ public static void main(String[] args){ int score = 178 ; if(score <= 100 && score >= 90){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:A等"); }else if(score < 90 && score >= 80){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:B等"); }else if(score < 80 && score >= 70){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:C等"); }else if(score < 70 && score >= 60){ System.out.println("您的成绩是:"+score+",相对应的成绩等级为:D等"); }else if(score >=0 && score < 60){ System.out.println("您的成绩是:"+score+",叫家长,谈人生!"); }else{ System.out.println("成绩输入错误请检查后重新输入!"); } } }
【例5.6】给出月份,判断它所处的季节 3-5 春季 6-8 夏季 9-11 秋季 12-2 冬季
分析:我们首先来看需求
- 首先我们需要定义一个变量来代表月份,我们用这个变量来在区间中比较;
- 第二这个变量要符合我们的要求,即大于等于1,小于等于12,所以我们要考虑输入错误的情况;
- 第三我们要选择合适的语句,在这里我们有很多种方法,下面一一介绍
方法一:一个个比较,使用简单if语句。
class SeasonPractice1{ public static void main(String[] args){ int month = 9 ; //声明一个代表月份的变量 if( month == 1){ System.out.println("这个月份属于冬季!"); } ...... if( month == 3){ System.out.println("这个月份属于春季!"); } ...... if( month == 6){ System.out.println("这个月份属于夏季!"); } ...... if( month == 9){ System.out.println("这个月份属于秋季!"); } ...... if( month == 12){ System.out.println("这个月份属于冬季!"); }else{ System.out.println("您输入的数据储存在问题,请检查后重新输入!"); } } }
方法2:使用逻辑运算符加上if语句。
class SeasonPractice2{ public static void main(String[] args){ int month = 2 ; if(month == 12 || month == 1 || month == 2){ System.out.println("这个月份属于冬季!"); //我们在这里使用if...else.if语句,需要明白语句的一个特性当有else.if语句为真时即跳出语句不再进行if.else语句,进行其他语句 }else if(month == 3 || month == 4 || month == 5){ System.out.println("这个月份属于冬季!"); }else if(month == 6 || month == 7 || month == 8){ System.out.println("这个月份属于冬季!"); }else if(month == 9 || month == 10 || month == 11){ System.out.println("这个月份属于冬季!"); }else { System.out.println("对不起,您输入的数据存在问题,请检查后重新输入!"); } } }
方法三:使用比较运算符,逻辑运算符和if语句;
class SeasonPractice3{ public static void main(String[] args){ int month = 17 ; if(month == 1 || month == 2 || month == 12){ System.out.println("这个月份属于冬季!"); }else if(month >= 3 && month <= 5){ System.out.println("这个月份属于春季!"); }else if(month >= 6 && month <= 8){ System.out.println("这个月份属于夏季!"); }else if(month >= 9 && month <= 11){ System.out.println("这个月份属于秋季!"); }else{ System.out.print("对不起,您输入的数据错误,请检查后重新输入!"); } } }
方法四:精简代码,从上面的三种方法我们可以看出代码的相同性有这么几点,(变量的判断比较,结果的输出,逻辑运算符的运用),我们将这相同的几点进行精简如下!
class SeasonLastPractice{ public static void main(String[] args){ int month = 7 ; String str ; if(month == 1 || month == 2 || month == 12){ str = "这个月份属于冬季!"; }else if(month >= 3 && month <= 5){ str = "这个月份属于春季!"; }else if(month >= 6 && month <= 8){ str = "这个月份属于夏季!"; }else if(month >= 9 && month <= 11){ str = "这个月份属于秋季!"; }else{ str = "对不起,您输入的数据错误,请检查后重新输入!"; } System.out.print(str); } }
【例5.7】比较三个数的大小(if语句的嵌套使用)
package cn.if_else; public class ComparePractice { public static void main(String[] args) { test(7, 7, 7); test(1, 2, 3); test(2, 1, 3); test(3, 2, 1); test(1, 3, 2); } public static void test(int a,int b,int c){ if(a>=b){ if(b>=c) System.out.println("这三个数的大小为:"+"a>=b>=c"); else if (a>=c) { System.out.println("这三个数的大小为:"+"a>=c>b"); }else { System.out.println("这三个数的大小为:"+"c>a>=b"); } }else { if(b<=c) System.out.println("这三个数的大小为:"+"a<b<=c"); else if(a<=c){ System.out.println("这三个数的大小为:"+"a<=c<b"); }else { System.out.println("z这三个数的大小为:"+"c<a<b"); } } } }
【例5.8】求三个数中的最值;(这里本人做出了一种测试,实际可以有多重方法,不一一赘述,详细的可以参见CSDN的一篇文章,代码赘述在下面)
package cn.if_else; public class MaxPractice { public static void main(String[] args){ max(7, 6, 9); min(7, 6, 9); } public void test(){ int a = 2 , b = 8 , c = 6 , max = 0; //如果只是求最大值,那么我们只用拿出大的那个值同最后一个值比较 if(a > b){ if(a > c){ max = a ; }else{ max = c ; } }else{ if(b > c){ max = b ; }else{ max = c ; } } System.out.print("三个数的最大值为:"+max); } /** * 求最大值 */ public static void max(int a,int b,int c){ if(a>=b&&a>=c) System.out.println("最大值为:"+"a"); else if (c>=b&&c>=a) { System.out.println("最大值为:"+"c"); }else if(b>=a&&b>=c) { System.out.println("最大值为:"+"b"); } } /** * 求最小值 */ public static void min(int a,int b,int c){ if(a<=b&&a<=c){ System.out.println("最小值为:"+"a"); }else if (b<=a&&b<=c) { System.out.println("最小值为:"+"b"); }else if (c<=a&&c<=b) { System.out.println("最小值为:"+"c"); } } }
1、if语句嵌套 int a = 10; int b = 30; int c = 20; int max; if (a > b) { if (a > c) { max = a; } else { max = c; } } else { if (b > c) { max = b; } else { max = c; } } 2、if语句 int a = 10; int b = 30; int c = 20; int max; if (a > b) { max = a; } else { max = b; } if (max < c) { max = c; } 3、if语句(假定a最大,b,c与a比较,如果比a大,则赋值给max) int a = 10; int b = 30; int c = 20; int max = a; if (b > max) { max = b; } if (c > max) { max = c; } 4、三元运算符 int a = 10; int b = 30; int c = 20; int max = (a > b) ? a : b; max = (max > c) ? max : c; 或者 int max = ((a > b ? a : b) > c) ? (a > b ? a : b) : c;(建议不用这种) 5、if语句 + 逻辑运算符 &&(a,b,c三个数,如果不是a最大,或者b最大,就是c最大) int a = 10; int b = 30; int c = 20; int max; if (a > b && a > c) { max = a; } else if (c > a && c > b) { max = c; } else max = b;
1.3.3 选择语句
在JDK 1.6及以前的版本中,switch语句中表达式的值必须是整型或字符型,常量值1~n必须也是整型或字符型,但是在JDK 1.7中,switch语句的表达式的值除了整型和字符型,还可以是字符串类型,这是JDK1.7 新添的特性。
switch语句:
- A.当我们看到switch的时候,这就是一个选择语句
- B.表达式:是一个常量或者变量,byte,short,int,char,所以case取值其实与表达式的类型一致
- jdk1.5以后支持枚举, jdk1.7以后支持String
- C.case:表示的就是一个选项,取值就是选项的值
- D.执行语句:功能代码.
- E.break:switch语句的结束符.
- F.default:默认值,相当于if语句的else
【例5.9】根据指定的日期(1~7),输出相应的星期;
class SwitchWeekPractice{ public static void main(String[] args){ int day = 9 ; switch(day){ default: //若没有一个常量的值与表达式的值相同则默认执行default, System.out.println("请检验您的输入数字是否正确!"); //如果没有发现break,则继续执行下面的case语句直到发现break case 1: System.out.println("根据您输入的数字可以确定是:星期一"); break; /*default: 一个switch语句中只能有一个default,否则会提示标签重复 System.out.println("请检验您的输入数字是否正确!");*/ case 2: System.out.println("根据您输入的数字可以确定是:星期二"); break; case 3: System.out.println("根据您输入的数字可以确定是:星期三"); break; case 4: System.out.println("根据您输入的数字可以确定是:星期四"); break; case 5: System.out.println("根据您输入的数字可以确定是:星期五"); break; case 6: System.out.println("根据您输入的数字可以确定是:星期六"); break; case 7: System.out.println("根据您输入的数字可以确定是:星期日"); break; } } }
Switch语句的执行过程:
【例5.10】根据输入的城市名字,查询出城市所在的省;
class ProvincePractice{ public static void main(String[] args){ String str = "洛阳"; switch(str){ case "石家庄": System.out.println("这是河北省会;"); break; case "济南": System.out.println("这是山东省会;"); break; case "郑州": System.out.println("这是河南省会;"); break; case "洛阳": System.out.println("这是河南地级市;"); break; default: System.out.println("对不起您所查找的城市在数据库中没有发现,请检查后输入!"); } } }
【例5.11】根据给定的月份,判断所属的季节;冬季(12,1,2)春季(3,4,5)夏季(6,7,8)秋季(9,10,11)
class SwitchMonthPractice{ public static void main(String[] args){ int month = 9 ; String str = ""; switch(month){ //运用Switch的省略,将break适当省略,将共性放在一处源代码 case 1: str = "冬季"; case 2: str = "冬季"; case 12: str = "冬季"; break; case 3: str = "春季"; case 4: str = "春季"; case 5: str = "春季"; break; case 6: str = "夏季"; case 7: str = "夏季"; case 8: str = "夏季"; break; case 9: str = "秋季"; case 10: str = "秋季"; case 11: str = "秋季"; break; default: System.out.println("请检查您所输入的数字是否在范围中!"); } System.out.print("根据您所输入的月份判断季节为:"+str); } }
总结:选择语句的功能通过判断语句也是可以实现的,实际上这两个语句在功能上相似,但是在进行选择操作时,switch语句能够更加清楚明了,我们在进行多项选择操作的时候,且具有明确的选择项,那么switch是个很好的选择,但往往我们在程序中并没有明了的选择项,所以if语句是常见的操作。
1.3.4 循环语句
注意:循环语句是和if语句一样常见的语句,需要重点关注一下;
1.3.4.1 while循环
【例5.12】将1到100的所有奇数都打印出来,并对他们进行求和运算;
分析:首先我们要明白这是一个累加的运算,我们在代码中涉及到的是两个变量,奇数和累加的和;对于奇数,我们对他的判断应该是除2取余为1,下面我们通过代码来分析;
class OddPractice{
public static void main(String[] args){
int i = 0 ,sum = 0; //定义一个代表1到100的变量和奇数和的变量
while(i <= 100){
if(i%2==1){
System.out.print(i+"、");
sum += i;
}
i++;//省略的话死循环,因为i值不变while后边的条件表达式永远为真
}
System.out.println("我们所求的奇数和为:"+sum);
}
}
While语句的执行过程
1.3.4.2 do...while循环
【例5.13】比较while和do...while;
class CompareWhilePractice{
public static void main(String[] args){
int a = 100 , b = 100 ;
//鲜明的比较while和do...while的区别
while(a == 60){
System.out.println("Ok"+a);
a--;
}
do{
System.out.println("Ok"+b);
b--;
}while(b == 60);
}
}
1.3.4.3 for循环
1.3.4.3.1 for语句
小结:
- 关键字:for
- 固定格式:for(初始化表达式(3);循环条件表达式(1);循环后的操作表达式(4))(2){执行语句(5)}
- 运行顺序: 循环条件为true时 3--1--5--4--1--5
循环条件为false时 3--1 当循环条件为false时,循环终止
注意事项:
- 1、变量作用域问题:
-
- 如果后边要使用这个变量,需要定义在for循环前
- 如果后边不使用这个变量,需要定义在for循环中
- 第一个表达式可以放置在循环体前,可以为空
- 第三个表达式可以放置在循环体中,可以为空
- 第二个表达式可以为空,不报错,但是为死循环。除非特殊业务或算法需求,否则不会出现该种情况
【例5.14】计算1到100相加的和;
class SumPractice{ public static void main(String[] args){ int sum = 0; for(int i = 1;i<101;i++){ sum += i; } System.out.println("1到100的累计相加的和为:"+sum); } }
注意:在编程时,有时会使用for循环的特殊语法格式来实现无限循环,语法格式为:
For(;;){
......
}
对于这种无限循环可以通过break语句跳出循环,例如:
For(;;){ If(i<20){ System.out.println(“无限循环”); } Break; }
package cn.for_test; public class Test { public static void main(String[] args) { int i = 20; for (; ; i++) { if(i > 25){ System.out.println("通过break关键字跳出死循环!" + "--i = " + i); break; } } } }
1.3.4.3.2 foreach语句
foreach语句是for语句的特殊简化版本,foreach语句并不能完全取代for语句,然而任何foreach语句都可以改为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为foreach语句。foreach语句在遍历数组等方面为程序员提供了很大方便(在数组中我们将会讲到)。foreach语句也叫增强for循环,增强for循环是for的一种新用法!用来循环遍历数组和集合。编译器在编译时会将加强for转换为底层迭代操作,外观上看起来增强了for的语法,实际上是通过迭代器来实现的。关于foreach循环我们在这里不多做介绍,我会在一篇文章“扒掉foreach的外衣中详细探讨foreach的底层运作”!
语法格式如下
for(元素变量x:遍历对象 obj){
引用了x的Java语句;
}
x的值从数组的第一个元素一直到最后一个元素!
foreach语句中的元素变量x,不必对其进行初始化。下面通过一个小例子来说明;
【例5.15】创建一个一维数组,对其进行遍历,通过两种for循环;
public class Repetition{ public static void main(String args[]){ int arr[] = {1,2,3,4,5}; System.out.print("数组中的元素为:"); /*标准for循环 for(int i = 0;i<5;i++){ System.out.print(arr[i]+","); }*/ for(int x:arr){ System.out.print(x+","); //foreach语句,元素变量x为遍历数组的元素值 } } }
增强for的冒号左边是定义变量,右边必须是数组或集合类型。例如上例中循环遍历的arr这个int数组,增强for内部会依次把arr中的元素赋给变量i。
增强for * 1. 只是语法简单了一点点! * 2. 它没有老for增大! 特点: * 1. 只能遍历数组、集合... * 2. 在遍历时不能使用下标 * 3. 遍历只能从头到尾 * 4. 对数组和集合只能做读操作,不能做写操作! 语法: * 1. for(元素类型 变量名 : 集合或数组对象) * 2. 每次循环,获取一个数组中的元素给左边的变量了。 增强for到底可以遍历什么: * 1. 可以遍历任何的实现了Iterable接口的实例 * 2. 增强for底层是Iterator |
1.3.4.4 循环语句小结
为了完成重复的事情,我们通常要使用循环来完成需求
3.1 while循环 3.2 do while 3.3 for循环 While语句格式 do{执行语句} for(初始化表达式;循环 条件表达式;循 While(条件表达式){ while(条件表达式); 环后的操作表达式){ 执行语句 } 执行语句 } |
for条件相对复杂,但是最常用,while/do while 简单易懂--具有明确的判断条件时使用
Do while循环较少使用
循环需要的内容:
1、循环条件----循环条件表达式 如果没有循环条件就会一直循环下去----存在死循环现象
2、循环体:执行语句----循环执行的代码语句
3、循环变量定义并初始化-----初始化表达式
4、循环变量的变化情况----循环后的操作表达式
如果已经可以判断出循环次数的话,使用for循环比较方便,如果不知道循环次数使用while循环比较合适。注意的一点是多线程中我们使用while,而不建议使用if,这个稍后在多线程中介绍。