4.6 流程控制
一般来说,程序的执行流程是从上到下逐行执行的。一条语句执行完后再执行下一条语句,直到程序的末尾。这个执行流程可以通过下图来表示:
但是程序的整个执行流程并不是一成不变的。很多时候需要根据不同的条件或状态来改变程序的执行流程,或者反复执行某些语句来实现特定功能,这些情况在程序中经常发生。
4.6.1 if判断
如果符合某种条件就执行相应语句,可以使用if来实现这个功能。其语法结构如下:
if(条件表达式){ 语句块; }
说明:只有当条件表达式值为true(真)时,语句块才会被执行。程序执行流程图如下:
范例:IfDemo.java
public class IfDemo{ public static void main(String[] args){ int num1 = 5; int num2 = 4; if(num1 > num2){ System.out.println(num + "大于" + num2); } } }
当条件表达式的结果为true(真)时,会执行代码块中的语句;当条件表达式的结果为false(假)时,不会执行代码块中的语句。
如果想条件表达式结果为true时执行某些语句,而条件表达式结果为false时执行另外一些语句,则可以使用if...else...来实现,其语法结构如下:
if(条件表达式){ 语句块1; }else{ 语句块2; }
说明:当条件表达式值为true(真)时,执行语句块1;值为false(假)时,执行语句块2。执行完if判断后,再执行其它语句。程序执行流程图如下:
范例:IfElseDemo.java
public class IfElseDemo{ public static void main(String[] args){ int num1 = 3; int num2 = 4; if(num > 4){ System.out.println(num1 + "大于" + num2); }else{ System.out.println(num1 + "小于" + num2); } } }
如果根据不同条件表达式中来决定执行那些语句的话,还可以使用if...else...的嵌套来完成。其语法格式如下:
if(条件表达式1){ 语句块1; }else if(条件表达式2){ 语句块2; }else{ 语句块3; }
说明:当条件表达式1值为true(真)时,执行语句块1;条件表达式1值为false(假)时,执行条件表达式2的判断,如果条件表达式2的值为true(真)就执行语句块2,条件表达式2的值为false(假)就执行语句块3。执行完if代码块后,执行后面其它语句。程序执行流程图如下:
范例:IfElseNest.java
public class IfElseNest{ public static void main(String[] args){ int score = 75; char result; if(score >= 90){ result = 'A'; }else if(score >= 80 && score < 90){ result = 'B'; }else if(score >= 70 && score < 80){ result = 'C'; }else if(score >= 60 && score < 70){ result = 'D'; }else{ result = 'E'; } System.out.println(score + "分等级为:" + result); } }
4.6.2 switch多重选择
当if...else...嵌套多了后,程序代码会变得非常臃肿,而switch语句可以将多选一的情况简化,使程序代码变得简洁易懂。在JDK7之前,switch只能用于比较整数和字符。而JDK7之后,除了可以比较整数和字符外,还可以比较字符串和Enum。switch语法格式如下:
switch(变量或表达式){ case 值1: 语句块1; break; case 值2: 语句块2; break; ...... case 值n: 语句块n; break; default: 语句块; break; }
说明:首先根据switch后括号中的变量或表达式的值与case的设置的值进行比对,如果符合就执行之后的语句块,直到遇到break后离开switch区块,如果没有符合的值,则会执行default后的语句块。default不一定需要,如果不需要处理默认动作,可以省略default块。程序执行流程图如下:
范例:SwitchDemo.java
public class SwitchDemo{ public static void main(String[] args){ int num1 = 60, num2 = 4; char operate = '+'; switch(operate){ case '+': System.out.println(num1 + " + " + num2 + " = " + (num1 + num2)); break; case '-': System.out.println(num1 + " - " + num2 + " = " + (num1 - num2)); break; case '*': System.out.println(num1 + " * " + num2 + " = " + (num1 * num2)); break; case '/': System.out.println(num1 + " / " + num2 + " = " + (num1 / num2)); break; } } }
4.6.3 for循环
在Java中如果要对某些语句块重复执行指定次数,就可以使用for循环。语法格式如下:
for(循环变量初值; 判断条件; 循环变量增减量){ 语句块; }
说明:for循环语法的圆括号中,“循环变量初值”只会执行一次,结束for循环后变量就会消失。而“判断条件”则是每次执行循环体前都会执行一次,且值必须是true或false。true就会执行循环体,false就会结束循环。“循环变量增减量”则是每次执行完循环体后就会执行一次,然后再执行“判断条件”。程序执行流程图如下:
示例:CalculateDemo.java
public class CalculateDemo{ public static void main(String[] args){ int sum = 0; for(int i = 1; i <= 10; i++){ sum += i; } System.out.println(sum); } }
for循环还可以嵌套使用来完成一些特殊的功能。比如打印三角形,九九乘法表等。以九九乘法表为例来说明嵌套for循环的使用。示例代码如下:
范例:NineNineTableDemo.java
public class NineNineTableDemo{ public static void main(String[] args){ int i, j; for(i = 1; i<=9; i++){ for(j = 1; j<=9; j++){ System.out.print(i+"*"+j+"="+(i*j)+"\t"); } System.out.println(); } } }
运行结果如下:
4.6.4 while循环
Java提供while循环,可根据指定循环条件来判断是否执行循环体。语法格式如下:
while(循环条件){ 循环语句块; }
说明:如果循环体只有一行语句,则while后的“{”和“}”可以省略不写,但当有两行以上语句时,就必须在写了。while主要用于停止条件必须在执行时期判断的重复性动作。程序执行流程图如下:
范例:WhileDemo.java
public class WhileDemo{ public static void main(String[] args){ int i = 10; while(i>0){ System.out.println(i); i--; } } }
本例会循环输出10到1这几个数值。
4.6.5 do...while循环
do...while循环也是根据指定循环条件来判断是否执行循环体。它和while循环不同之处在于,do...while循环是先执行一次循环体后再判断循环条件;而while循环是先判断循环条件,当满足循环条件后才会执行循环体。因此,do...while至少会执行一次循环体。语法格式如下:
do{ 循环体语句块; }while(循环条件);
程序流程图如下:
范例:DoWhileDemo.java
public class DoWhileDemo{ public static void main(String[] args){ int num; do{ num = (int)(Math.random()*21);//生成0-20的随机数 System.out.println(num); }while(num != 10); } }
本例只要num的值不为10就会一直循环并输出,当num的值为10时就退出循环。
4.6.6 break和continue
break可以让程序退出当前switch、for、while、do...while的区域块,并执行该区域块后的语句。在switch中主要用来中断下一个case比较;而在for、while、do...while中主要用于中断当前循环。
而continue的作用与break类似,它使用于for、while、do...while循环。与break用于循环相对比,break是结束当前循环,而continue只会结束本次循环,并进入下一次循环。
范例:BreakDemo.java
public class BreakDemo{ public static void main(String[] args){ int num = 0; while(num > 10){ if(num > 5) break; System.out.println(num); num++; } } }
本例输出0到4这几个数。
范例:ContinueDemo.java
public class ContinueDemo{ public static void main(String[] args){ int num = 0; while(num > 10){ if(num % 2 == 0) continue; System.out.println(num); num++; } } }
本例输出0到10之间的奇数。