Java 从入门到项目实践(超值版)
上QQ阅读APP看书,第一时间看更新

第3章 程序的运行轨迹——Java语言的流程控制

◎ 本章教学微视频:14个 52分钟

学习指引

在Java中,程序之所以能够按照人们的意愿执行,主要是依靠程序的控制结构。无论多么复杂的程序,都是由这些基本的语句组成的。本章介绍Java语言的流程控制,主要内容为流程控制的3种方式——程序的顺序结构、分支结构和循环结构。

重点导读

  • 熟悉Java程序运行的流程控制方式。
  • 掌握Java程序运行的顺序结构。
  • 掌握Java程序运行的分支结构。
  • 掌握Java程序运行的循环结构。
  • 掌握Java程序运行的跳转语句。

3.1 流程控制

Java程序的流程控制包括顺序控制、条件控制和循环控制。顺序控制是从头到尾依次执行每条语句操作。条件控制是基于条件选择执行语句,如果条件成立,则执行操作A,反之则执行操作B。循环控制又称为回路控制,是根据循环初始条件和终结要求执行循环体内的操作。

具体地讲,程序流程控制语句分为3类:分支语句,包括if语句和switch语句;循环语句,包括for语句、while语句和do…while语句;跳转语句,包括break语句、continue语句和return语句。

3.2 顺序结构

顺序结构是最简单、最常用的程序结构,只要按照解决问题的步骤写出相应的语句就行,它的执行顺序是自上而下依次执行。有一些程序并不按顺序执行语句,这个过程称为控制的转移,它涉及了另外两类程序的控制结构,即分支结构和循环结构。

3.3 分支结构

在实际的程序设计中,根据输入数据和中间结果的不同情况需要选择不同的语句执行,在这种情况下,必须根据某个变量或表达式的值做出判断,以决定执行哪些语句和跳过哪些语句不执行。Java有两种分支结构,分别是if语句和switch语句。

3.3.1 if语句

一个if语句包含一个布尔表达式和一条或多条语句。其语法格式如下:

     if(布尔表达式)
     {
        语句//如果布尔表达式为true将执行的语句
     }

如果布尔表达式的值为true,则执行if语句大括号中的语句,否则执行if语句后面的代码。if语句流程图如图3-1所示。

图3-1 if语句流程图

【例3-1】(实例文件:ch03\Chap3.1.txt)if语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int x = 10;
             if (x < 20) {
                 System.out.print("这是 if 语句");
             }
         }
     }

程序运行结果如图3-2所示。

图3-2 if语句应用实例

3.3.2 if…else语句

if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句会被执行。语法格式如下:

     if(布尔表达式){
        语句1 //如果布尔表达式的值为true将执行的语句
     }else{
        语句2 //如果布尔表达式的值为false将执行的语句
     }

if…else表示判断两种情况:要么满足if的条件;要么不满足if的条件,此时执行else语句。if…else语句流程图如图3-3所示。

图3-3 if…else语句流程图

【例3-2】(实例文件:ch03\Chap3.2.txt)if…else语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int x = 30;
             if (x < 20) {
                 System.out.print("这是 if 语句");
             } else {
                 System.out.print("这是 else 语句");
             }
         }
     }

程序运行结果如图3-4所示。本例中若x小于20,则显示“这是if语句”;其他情况则显示“这是else语句”。x和20进行比较有3种情况,大于、小于和等于,此时的else应该包括了大于和等于两种情况,即x只要是大于或等于20就会执行else语句内的代码。

图3-4 if…else语句应用实例

3.3.3 if…else if…else语句

if语句后面可以跟else if…else语句,这种语句可以检测多种可能的情况,也被称为多条件判断语句或多分支语句。if多条件判断语句流程图如图3-5所示。

图3-5 if多条件判断语句流程图

使用if…else if…else语句的时候,需要注意下面几点:

  • if语句至多有—个else语句,else语句在所有的else if语句之后。
  • if语句可以有若干else if语句,它们必须在else语句之前。
  • 一旦其中一个else if语句检测为true,其他的else if以及else语句都将被跳过。

if…else if…else语句应用的语法格式如下:

     if(布尔表达式 1){
        语句1//如果布尔表达式 1的值为true执行的代码
     }else if(布尔表达式 2){
        语句2//如果布尔表达式 2的值为true执行的代码
     }else if(布尔表达式 3){
        语句3//如果布尔表达式 3的值为true执行的代码
     }else {
        语句4//如果以上布尔表达式都不为true执行的代码
     }

【例3-3】(实例文件:ch03\Chap3.3.txt)多条件判断语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int x = 30;
           if (x == 10) {
               System.out.print("Value of X is 10");
           } else if (x == 20) {
               System.out.print("Value of X is 20");
           } else if (x == 30) {
               System.out.print("Value of X is 30");
           } else {
               System.out.print("这是 else 语句");
           }
        }
     }

程序运行结果如图3-6所示。

图3-6 多条件判断语句应用实例

提示:多条件判断语句就是利用多个条件进行判断,如果有一个条件满足,则执行,不满足则继续向后判断。

3.3.4 嵌套的if…else语句

使用嵌套的if…else语句是合法的,也就是说可以在一个if或者else if语句中使用if或者else if语句。语法格式如下:

     if(布尔表达式 1){
        语句1//如果布尔表达式 1的值为true执行的代码
        if(布尔表达式 2){
        语句2//如果布尔表达式 2的值为true执行的代码
        }
     }

【例3-4】(实例文件:ch03\Chap3.4.txt)嵌套的if…else语句应用实例。

     public class Test {
        public static void main(String args[]){
           int x = 30;
           int y = 10;
           if( x == 30 ){
              if( y == 10 ){
                  System.out.print("X = 30 and Y = 10");
              }
           }
        }
     }

程序运行结果如图3-7所示。

图3-7 嵌套的if…else语句应用实例

3.3.5 switch语句

switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。switch本身只能够支持int、char型,在JDK 1.5之后可以使用enum型,而在JDK 1.7之后可以使用String型。语法格式如下:

     switch(expression){
         case value :
            语句
            break; //可选
         case value :
            语句
            break; //可选
         //可以有任意数量的case语句
         default : //可选
            语句
     }

switch语句有如下规则:

  • switch语句中的变量类型可以是byte、short、int或者char。从Java SE 7开始,switch支持字符串类型。case标签必须为字符串常量或字面量。
  • switch语句可以拥有多个case语句。每个case后面跟一个要比较的值和冒号。
  • case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面量。
  • 当变量的值与case语句的值相等时,case语句之后的语句开始执行,直到break语句出现才会跳出switch语句。
  • 当遇到break语句时,switch语句终止。程序跳转到switch语句后面的语句执行。case语句不是必须包含break语句。如果没有break语句,程序会继续执行下一条case语句,直到遇到break语句。
  • switch语句可以包含一个default分支,该分支必须是switch语句的最后一个分支。default在没有case语句的值和变量值相等的时候执行。default分支不需要break语句。

【例3-5】(实例文件:ch03\Chap3.5.txt)switch语句应用实例。

     public class Test {
         public static void main(String[] args) {
             char grade = 'C';
             switch (grade) {
             case 'A':
                 System.out.println("优秀");
                 break;
             case 'B':
             case 'C':
                 System.out.println("良好");
                 break;
             case 'D':
                 System.out.println("及格");
           case 'F':
               System.out.println("你需要再努力努力");
               break;
           default:
               System.out.println("未知等级");
           }
           System.out.println("你的等级是 " + grade);
        }
     }

程序运行结果如图3-8所示。

图3-8 switch语句应用实例

提示:使用switch语句的时候,如果满足条件的语句中没有break,那么就会在执行完满足条件的case语句后,继续判断下一个case语句的值是否满足条件,一直到switch语句结束或者是遇到break为止。

3.4 循环结构

顺序结构的程序语句只能被执行一次。如果想要使同样的操作执行多次,就需要使用循环结构。Java中有3种主要的循环结构,分别是while循环、do…while循环、for循环,另外,在Java 5中引入了一种主要用于数组的增强型for循环。

3.4.1 while语句

while是最基本的循环,只要布尔表达式为true,循环体会一直执行下去。语法格式如下:

     while( 布尔表达式 ) {
       语句//循环内容
     }

while语句流程图如图3-9所示。

图3-9 while语句流程图

【例3-6】(实例文件:ch03\Chap3.6.txt)while语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int x = 10;
             while (x < 20) {
                 System.out.print("value of x : " + x);
                 x++;
                 System.out.print("\n");
             }
         }
     }

程序运行结果如图3-10所示。在本实例中,给定x初始值10,当满足x小于20这个条件时,会循环执行while语句,x每循环一次自加1,直到不满足条件为止。

注意:while语句一定要在循环内有让条件不成立的代码,否则就会陷入死循环。

图3-10 while语句应用实例

3.4.2 do…while语句

对于while语句而言,如果不满足条件,则不能进入循环。但有时候需要即使不满足条件也至少执行一次。do…while循环和while循环相似,不同的是,do…while循环至少会执行一次。语法格式如下:

     do {
            语句
     }while(布尔表达式);

注意:布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。如果布尔表达式的值为true,则语句块一直执行,直到布尔表达式的值为false。do…while语句的流程图如图3-11所示。

图3-11 do…while语句流程图

【例3-7】(实例文件:ch03\Chap3.7.txt)do…while语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int x = 1;                            //定义变量x,初始值为1
             do {
                 System.out.println("x = " + x);   //打印x的值
                 x++;                              //将x的值自增
             } while (x <= 4);                     //循环条件
         }
     }

程序运行结果如图3-12所示。

提示:while语句属于先判断后执行,而do…while语句先执行一次,而后再进行判断。do…while循环和while循环能实现同样的功能。然而在程序运行过程中,这两种语句还是有差别的。如果循环条件在循环语句开始时就不成立,那么while循环的循环体一次都不会执行,而do…while循环的循环体会执行一次。

图3-12 do…while语句应用实例

3.4.3 for语句

虽然所有循环结构都可以用while或者do…while表示,但Java还提供了另一种语句——for循环,使一些循环结构变得更加简单。for循环执行的次数是在执行前就确定的。语法格式如下:

     for(初始化表达式; 循环条件; 循环控制变量) {
         语句
     }

for关键字后面()中包括3部分内容:初始化表达式、循环条件和循环控制变量,它们之间用“;”分隔,{}中的语句为循环体。关于for循环有以下几点说明:

  • 最先执行初始化步骤。可以声明一种类型,可以初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测循环条件的值。如果为true,循环体被执行;如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。

【例3-8】(实例文件:ch03\Chap3.8.txt)for语句应用实例。

     public class Test {
         public static void main(String[] args) {
             for (int x = 10; x < 20; x++) {
                 System.out.print("value of x : " + x);
                 System.out.print("\n");
             }
        }
     }

程序运行结果如图3-13所示。

图3-13 for语句应用实例

3.4.4 增强for语句

Java 5引入了一种主要用于数组的增强for语句。语法格式如下:

     for(声明语句 : 表达式)
     {
        语句
     }

声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块内,其值与此时数组元素的值相等。

表达式:是要访问的数组名,或者是返回值为数组的方法。

【例3-9】(实例文件:ch03\Chap3.9.txt)增强for语句应用实例。

     public class Test {
         public static void main(String[] args) {
             int[] numbers = { 10, 20, 30, 40, 50 };
             for (int x : numbers) {
                 System.out.print(x);
                 System.out.print(",");
             }
             System.out.print("\n");
             String[] names = { "James", "Larry", "Tom", "Lacy" };
             for (String name : names) {
                 System.out.print(name);
                 System.out.print(",");
             }
         }
     }

程序运行结果如图3-14所示。

图3-14 增强for语句实例

3.5 跳转语句

在Java语言中,支持3种跳转语句:break、continue和return语句,这些语句把控制转移到程序的其他部分。

3.5.1 break语句

break语句主要用在循环语句或者switch语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。break的用法很简单,语法格式如下:

     break;

在Java中,break语句有3种作用:

  • 在switch语句中,它被用来终止一个语句序列。
  • 它能被用来退出一个循环。
  • 它能作为一种“先进”的goto语句来使用。

【例3-10】(实例文件:ch03\Chap3.10.txt)break语句应用实例。

程序运行结果如图3-15所示。在本实例中,通过while循环显示x的值,当x的值为3时,使用break语句跳出循环,因此显示结果中没有出现“x=4”。

图3-15 break语句应用实例

3.5.2 continue语句

continue语句适用于任何循环控制结构中,作用是让程序立刻跳转到下一次循环的迭代。在for循环中,continue语句使程序立即跳转到下一次循环中。在while或者do…while循环中,程序立即跳转到布尔表达式的判断语句。

break语句和continue语句的区别:break语句是跳出当前层循环,终结整个循环,也不再判断循环条件是否成立;continue语句则是结束本次循环,不再运行continue之后的语句,然后重新回到循环的起点,判断循环条件是否成立,继续运行。

【例3-11】(实例文件:ch03\Chap3.11.txt)continue语句应用实例。

程序运行结果如图3-16所示。在本实例中,使用for循环让变量i的值在1~100内循环。在循环过程中,当i的值为偶数时,执行continue语句结束本次循环进入下一次循环;当i的值为奇数时,sum和i进行累加,最终得到1~100的所有奇数之和,显示sum=2500。

图3-16 continue语句应用实例

3.5.3 return语句

return语句作为一个无条件的分支,无须判断条件即可发生。return语句主要有两个用途:一是用来表示一个方法返回的值(假定返回值类型不是void),二是它导致该方法退出并返回值。

根据方法的定义,每一个方法都有返回类型,该类型可以是基本类型,也可以是对象类型,同时每个方法都必须有一个结束标志,return起到了这个作用。在返回类型为void的方法中有一个隐含的return语句,因此,在void方法中return可以省略不写。

3.6 就业面试解析与技巧

3.6.1 面试解析与技巧(一)

面试官:在Java中,如何跳出当前的多重嵌套循环?

应聘者:可以使用break或者return语句。

3.6.2 面试解析与技巧(二)

面试官:break语句和continue语句有什么区别?

应聘者:在循环体中,break语句是跳出循环,即结束整个循环;而continue语句是跳出本次循环,执行下一次循环。