day04--Java流程控制

今天主要学习如下内容
  1. 顺序结构和选择结构,选择结构有两种实现方式if和switch,
  2. 循环结构
  3 .跳转控制语句

JAVA流程控制

  • 一个Java程序,通常是由多条符合Java语法规则的语句组成的。
  • 一个Java程序的执行,一定意味着多条Java语句的执行。
  • 既然是多条Java语句的执行,执行的结果就一定与语句执行的顺序有关,同样的语句,不同的执行顺序,结果可能不同

因此我们需要知道,Java语言如何控制多条语句的执行顺序——通过流程控制(具体来说,是通过3种结构)

 

1.顺序结构

 1 package com.controlflow.sequential;
 2 
 3 /** 6  *
 7  *  顺序结构:描述的是Java语句之间,从上到下(或从左到右)依次执行的执行顺序
 8  *
 9  *  顺序结构是程序中最简单最基本的流程控制,没有特定的语法,就是按照代码书写的顺序执行。
10 
11     对于顺序结构而言,写在前面的代码先执行,写在后面的代码后执行
12  */
13 public class Demo {
14 
15   public static void main(String[] args) {
16     int i = 1;
17     int b = 2;
18   }
19 
20 }

顺序结构的流程图

 2.选择结构

  选择结构中的代码顺序和顺序结构中代码的执行顺序有明显的不同:

  • 选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断。
  • 逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
  • Java中,选择结构有2种实现形式,if语句 和switch语句

if语句实现选择结构有3种格式

回忆一下,之前我们所讲解的三元运算符,和if语句的第二种格式所表达的语义是否很相似呢?

if语句第二种格式和三元运算符既然如此相似,是否它们是完全等价的呢?

  • 三元运算符的操作都可以使用if语句改进,反之不成立
  • 什么时候不成立呢?

 

 

  1 package com.cskaoyan.controlflow.select;
  2 
  3 import java.util.Scanner;
  4 
  5 /** 15 
 16     if实现选择结构:
 17     1. 单分支的选择结构: 如果..就
 18     // 判断提条件的结果只能是true or false
 19     if(判断条件) {
 20       //语句体
 21     }
 22     判断条件是由一个 关系表达式 来表示的
 23 
 24     2. 双分支:如果..就。。,否则。。。
 25     if (判断条件) {
 26 
 27     } else {
 28 
 29     }
 30 
 31     3. 多分支(各个分支,平行,互斥)
 32     if(判断条件1) {
 33         条件1语句体
 34      } else if (条件2) {
 35         条件2语句体
 36      }
 37      ...
 38      else if (条件n) {
 39 
 40      } else {
 41        // 第n + 1种情况
 42       //当else前都不满足条件的时候,就会执行else中的语句体
 43      }
 44 
 45      在绝大部分场景下,三目运算符和if双分支选择结构,都可以相互替代,
 46      但是,如果选择结构执行的仅仅只是一个操作,没有返回值,此时if双分支选择结构不可以和三目运算相互替代
 47  */
 48 public class Deomo1Select {
 49 
 50   public static void main(String[] args) {
 51 
 52     Scanner scanner = new Scanner(System.in);
 53 
 54     int input = scanner.nextInt();
 55 
 56     //单分支的if 当用户输入的是正数就输出一下,否则什么都不做
 57     //if (input > 0) {
 58     //  //如果是正数
 59     //  System.out.println("亲, 您输入了一个整数" + input);
 60     //}
 61 
 62 
 63     //双分支  当用户输入正数的时候输出一下用户输入的正数,当用户输入了非正数提示一下,请用户输入正数
 64     //if (input > 0) {
 65     //  //如果输入的是正数
 66     //  System.out.println("亲, 您输入了一个整数" + input);
 67     //} else {
 68     //  System.out.println("亲,请重新输入一个正数");
 69     //}
 70 
 71     //多分支 当用户输入正数,0,负数
 72     //if (input > 0) {
 73     //  //正数
 74     //  System.out.println("亲, 您输入了一个整数" + input);
 75     //} else if (input == 0) {
 76     //  //0
 77     //  System.out.println("亲, 您输入了一个0");
 78     //} else {
 79     //  //负数
 80     //  System.out.println("亲,请重新输入一个数字");
 81     //}
 82 
 83     //关于双分支的if选择结构
 84     // 实现两数取大
 85     int a = 3;
 86     int b = 10;
 87     int max;
 88     if (a > b) {
 89       max = a;
 90     } else {
 91       max = b;
 92     }
 93 
 94     //可以用三目运算符来实现两数取大
 95     max = a > b ? a : b;
 96 
 97     //我们发现3目运算符的语义和if双支选择结构,语义几乎完全相同,
 98     // 都是非此即彼,但是至少有一种情况,它们不能相互替代
 99     if (a > b) {
100       System.out.println("大者是" + a);
101     } else {
102       System.out.println("大者是" + b);
103     }
104 
105     //三目运算符的结果一定是一个值
106     //a > b ? System.out.println("大者是" + a) : System.out.println("大者是" + b);
107 
108 
109   }
110 
111 }

练习:

  • 键盘录入x的值,计算出y的并输出。
  • 键盘录入月份的值,输出对应的季节。获取三个数据中的最大值
 1 package com.controlflow.select;
 2 
 3 import java.util.Scanner;
 4 
 5 /** 9  * 练习:
10     1.键盘录入x的值,计算出y的并输出。
11     x和y的关系满足如下:
12     x>=3       y = 2x + 1;
13     -1<=x<3      y = 2x;
14     x<=-1      y = 2x – 1;
15 
16     2.键盘录入月份的值,输出对应的季节。
17       12 1 2 冬季
18       3  4 5 春季
19       6 7 8  夏季
20       9 10 11 秋季
21     3.获取三个数据中的最大值
22  */
23 public class ExerciseIf {
24 
25   public static void main(String[] args) {
26     //1.键盘录入x的值,计算出y的并输出。
27     //Scanner scanner = new Scanner(System.in);
28     //int x = scanner.nextInt();
29     //int y;
30     //if ( x >= 3) {
31     //  y = 2 * x + 1;
32     //} else if (x >= -1 && x < 3) {
33     //  y = 2 * x;
34     //} else {
35     //  // x <= -1
36     //  y = 2 * x - 1;
37     //}
38     //System.out.println("x = " + x + "---- y = " + y);
39 
40 
41     //2.键盘录入月份的值,输出对应的季节。
42     //if (x == 12 || x == 1 || x == 2) {
43     //  //冬季
44     //  System.out.println("冬季");
45     //} else if ( x >= 3 && x <= 5) {
46     //  //春季
47     //  System.out.println("春季");
48     //} else if ( x >= 6 && x <= 8 ) {
49     //  //夏季
50     //  System.out.println("夏季");
51     //} else if ( x >= 9 && x <= 11) {
52     //  //秋季
53     //  System.out.println("秋季");
54     //} else {
55     //  //应对用户错误的输入
56     //  System.out.println("亲,您输入了错误的月份");
57     //}
58 
59     //3.获取三个数据中的最大值
60     int a = 10;
61     int b = 20;
62     int c = 15;
63 
64     //if的嵌套来实现
65     //if (a > b) {
66     //  // a大
67     //  if(a > c) {
68     //    // a 最大
69     //    System.out.println("最大值是: " + a);
70     //  } else {
71     //    // c最大
72     //    System.out.println("最大值是 " + c);
73     //  }
74     //} else {
75     //  // b大
76     //  if (b > c) {
77     //    System.out.println("最大值是: " + b);
78     //  } else {
79     //    System.out.println("最大值是: " + c);
80     //  }
81     //}
82 
83     //非嵌套方式
84     int tmp;
85     if ( a > b) {
86       tmp = a;
87     } else {
88       tmp = b;
89     }
90 
91     if (tmp > c) {
92       System.out.println(tmp);
93     } else {
94       System.out.println(c);
95     }
96 
97   }
98 
99 }

switch语句格式:

switch(表达式) {

case 值1:

语句体1;

break;

case 值2:

语句体2;

break;

default:

语句体n+1;

break;

}

 

格式解释:

  • switch关键字:表示这是一个switch语句
  • switch后的表达式:表示选择条件
  • case语句:每个case 语句表示一个分支
  • beak语句:表示结束switch语句
  • default语句:表示当所有其他的case的分支,都不能匹配
  • switch后表达式的值的时候,此时就会执行default分支。

注意事项:

  • switch语句后,表达式结果的取值范围?
  • case 后的常量取值?
  • break可以省略吗?
  • default可以省略吗?
  • switch语句的结束条件
 1 package com.controlflow.select;
 2 
 3 import java.util.Scanner;
 4 
 5 /** 8  *
 9  * switch语句格式: switch(表达式) { case 值1: //这个值,代表的一个特定分支 语句体1; //满足条件的分支执行的语句体 break; case 值2: 语句体2;
10  * break; … default: 语句体n+1; break; }
11  *
12  * 格式解释: switch关键字:表示这是一个switch语句 switch后的表达式:表示选择条件 表达式
13  *
14  * case语句:每个case 语句表示一个分支  类比于if所表示的一个分支 beak语句:表示结束 switch语句 default语句:表示当所有其他的case的分支,都不能匹配switch后表达式的值的时候,
15  * 此时就会执行default分支。 有点类似于 if-else多分支中最后的else
16  *
17  * 注意事项:
18  * 1. switch 表达式的结果类型 表达式的取值:byte, short, int, char JDK7以后可以是:String 字符串
19  * 2. case 后的常量取值?case后面的值,不能相同,值必须得是常量值,必须和表达式值的类型相同
20  *
21  * 3. break可以省略吗?语法上可以省略,省略之后,switch实现的就不再是我们所期望的多分支选择结构了,会发生一个现象case穿越
22  *    所谓的case穿越是指:当匹配到switch语句的某个分支,当该分支中不包含break语句,swtich语句不会自动结束,
23  *                      紧接着执行,紧邻的下一个case的语句体,最终要么遇到别的分支中的break;结束,
24  *                      要么匹配到最后一个case,结束switch语句
25  * 4. default可以省略吗?
26  *    语法上可以,一把建议不要省略,我们根据实际开发需要来决定
27  *
28  * 5. default分支,必须只能放在最后吗?
29  * 语法上没有问题,default分支可以放在switch的任意位置,注意default分支,
30  * 如果不在最后,如果不加break,仍然会发生case穿越现象
31  *
32  * 6.switch语句的结束条件
33  */
34 public class Demo2Switch {
35 
36   public static void main(String[] args) {
37 
38     Scanner sc = new Scanner(System.in);
39 
40     int i = sc.nextInt();
41 
42     switch (i) {
43 
44       default:
45         System.out.println("您输入了非 0,1,2的值");
46       case 0:
47         System.out.println("您输入了0");
48         break;
49       case 1:
50         System.out.println("您输入了1");
51         break;
52       case 2:
53         System.out.println("您输入了2");
54         break;
55 
56 
57     }
58 
59   }
60 
61 
62 }

练习:

  • 模拟做单项选择题,根据你的选择,给出对应的答案。(表达式是字符的情况)
  • 键盘录入字符串,根据给定的字符串,来输出你选择的字符串是什么?(表达式是字符串的情况)
  • 用switch语句实现键盘录入月份,输出对应的季节 看程序写结果
  1 package com.controlflow.select;
  2 
  3 import java.util.Scanner;
  4 
  5 /**  8  *
  9  * 1.模拟做单项选择题,根据你的选择,给出对应的答案。(表达式是字符的情况) 2.键盘录入字符串,根据给定的字符串,来输出你选择的字符串是什么?(表达式是字符串的情况)
 10  * 3.用switch语句实现键盘录入月份,输出对应的季节 4.看程序写结果
 11  */
 12 public class ExerciseSwitch {
 13 
 14   public static void main(String[] args) {
 15 
 16     //1.模拟做单项选择题,根据你的选择,给出对应的答案。
 17     //System.out.println("你的女神是?");
 18     //System.out.println("A.高圆圆");
 19     //System.out.println("B.云姐");
 20     //System.out.println("C.沈佳宜");
 21     //System.out.println("D.石原里美");
 22 
 23     Scanner sc = new Scanner(System.in);
 24     //String s = sc.nextLine();
 25     //char c = s.charAt(0);
 26     //
 27     //switch (c) {
 28     //  case 'A' :
 29     //    System.out.println("您的女神是:高圆圆");
 30     //    break;
 31     //  case 'B' :
 32     //    System.out.println("您的女神是:云姐");
 33     //    break;
 34     //  case 'C' :
 35     //    System.out.println("您的女神是:沈佳宜");
 36     //    break;
 37     //  case 'D' :
 38     //    System.out.println("您的女神是:石原里美");
 39     //    break;
 40     //}
 41 
 42     //2.键盘录入字符串,根据给定的字符串,来输出你选择的字符串是什么?(表达式是字符串的情况)
 43 
 44     //switch (s) {
 45     //  case "A" :
 46     //    System.out.println("您的女神是:高圆圆");
 47     //    break;
 48     //  case "B" :
 49     //    System.out.println("您的女神是:云姐");
 50     //    break;
 51     //  case "C" :
 52     //    System.out.println("您的女神是:沈佳宜");
 53     //    break;
 54     //  case "D" :
 55     //    System.out.println("您的女神是:石原里美");
 56     //    break;
 57     //}
 58 
 59     //3.用switch语句实现键盘录入月份,输出对应的季节 合理利用case穿越
 60     //int month = sc.nextInt();
 61     //switch (month) {
 62     //  case 12:
 63     //  case 1:
 64     //  case 2:
 65     //    System.out.println("冬季");
 66     //    break;
 67     //  case 3:
 68     //  case 4:
 69     //  case 5:
 70     //    System.out.println("春季");
 71     //    break;
 72     //  case 6:
 73     //  case 7:
 74     //  case 8:
 75     //    System.out.println("夏季");
 76     //    break;
 77     //  case 9:
 78     //  case 10:
 79     //  case 11:
 80     //    System.out.println("秋季");
 81     //    break;
 82     //  default:
 83     //    System.out.println("您输入了错误的月份");
 84     //}
 85 
 86     //4. 看代码,写结果
 87 /*    int x = 2;
 88     int y = 3;
 89     switch(x){
 90       default:
 91         y++;
 92         break;
 93       case 3:
 94         y++;
 95       case 4:
 96         y++;
 97     }
 98     System.out.println("y="+y);*/
 99 
100 
101     int x = 2;
102     int y = 3;
103     switch(x){
104       default:
105         y++;
106       case 3:
107         y++;
108       case 4:
109         y++;
110     }
111     System.out.println("y="+y);
112 
113 
114   }
115 
116 }

  选择结构有两种实现方式,这两种实现方式,各自适用于什么样的使用场景呢?

if的使用场景

  • 针对结果是boolean类型的判断
  • 分支对应多个表达式的多个取值

switch的使用场景

  • 针对结果是固定类型的判断
  • 表达式的取值范围只是固定的离散值集合,分支对应表达式的某一种取值
 1 public class compare {
 2 
 3   public static void main(String[] args) {
 4 
 5     //分支对应多个表达式的多个取值
 6     int x = 0;
 7     int y = 100;
 8 
 9     if (x > 0) {
10       // x > 0
11     } else if (y < 10) {
12       //  0=< y < 10 不对哈这里是我写错了哈
13       // 应该是  x <=0 && y < 10哈,讲课的时候主要想着区别,疏忽了具体代码哈
14     }
15 
16     switch (x) {
17       case 0: //一个值对应一个分支
18       break;
19 
20     }
21 
22 
23   }
24 
25 }

3.循环结构

在学习循环结构之前,我们首先来简单回顾顺序结构,选择结构中,Java语句的执行特点。

与顺序结构和选择结构不同,循环结构的主要功能是控制Java语句能够重复执行。

如何控制呢?

循环结构,从语法上来讲,有3种实现形式:

    • for语句
    • while语句
    • do while语句

但是,不管哪种实现形式,都由4部分组成:

    • 初始化语句
    • 条件判断语句
    • 循环体语句
    • 循环控制语句

  接下来我们首先来分析下,循环结构如何通过,这4个组成部分,完成控制Java语句重复执行的功能。

 for 循环语句:

for(初始化语句;判断条件语句;控制条件语句) {

  循环体语句;

}

执行流程:

注意事项:

  • 判断条件语句的结果的数据类型
  • 循环体语句
 1 public class Demo1 {
 2 
 3   public static void main(String[] args) {
 4 
 5     int j;
 6     //hello 你好 输出10次
 7     //1.设定一个计数值:记录你喊了多少次 hello 你好, 而且该计数值的初值为0(初始化语句)
 8     //2. 开始重复喊 hello 你好(循环体语句), 每喊一次 计数值会 + 1(循环体语句,改变循环变量,循环变量就是指喊的次数)
 9     //3. 喊hello 你好的计数值(喊的次数) 和 10 比较一下,当 计数值 > 10 结束(结束条件判断)
10     System.out.println("hello 你好");
11     System.out.println("hello 你好");
12     System.out.println("hello 你好");
13     System.out.println("hello 你好");
14     System.out.println("hello 你好");
15     System.out.println("hello 你好");
16     System.out.println("hello 你好");
17     System.out.println("hello 你好");
18     System.out.println("hello 你好");
19     System.out.println("hello 你好");
20 
21     // for 循环实现
22     //for(初始化语句;判断条件语句;控制条件语句) {
23     //  循环体语句;
24     //}
25     for(int i = 1; i <= 10; ++i) {
26       System.out.println("hello 你好 --- " + i);
27     }
28 
29 
30     //在for循环中定义了变量i,它的作用域,仅仅只在for循环中
31     //System.out.println(i);
32 
33   }
34 
35 }

练习:

  • 请在控制台输出数据1-10
  • 请在控制台输出数据10-1
  • 求出1-10之间数据之和
  • 求出1-100之间偶数和
  • 求5的阶乘 在控制台输出所有的”水仙花数”,统计”水仙花数”共有多少个
 1 public class Exercise {
 2 
 3   public static void main(String[] args) {
 4     //请在控制台输出数据1-10   第一个数1  最后一个数10
 5     for (int i = 1; i <= 10 ; i++) {
 6       // print 和 println 的区别仅仅在于:println输出之后自动换行
 7       //System.out.print(i + " ");
 8     }
 9 
10     //请在控制台输出数据10-1   第一个数10  最后一个数1
11     for (int i = 10; i >= 1 ; --i) {
12       //System.out.print(i + " ");
13     }
14 
15     //求出1-10之间数据之和
16     // 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
17     // (1 + 2) + 3 +...
18     //  (((1 + 2) + 3) + 4) + 5
19     // (((0 + 1) + 2) + 3 + ... )+10
20 
21     //初始和(累和变量)
22     int acc = 0;
23     for (int i = 1; i <= 10; i++) {
24        acc += i;
25     }
26     //System.out.println(acc);
27 
28     //求出1-100之间偶数和
29     acc = 0;
30     for (int i = 1; i <= 100 ; i++) {
31       if(i % 2 == 0) {
32         //是偶数
33         acc += i;
34       }
35     }
36    // System.out.println(acc);
37 
38     //求5的阶乘
39     // 1 5 * 4 * 3 * 2 * 1
40     int multi = 1; //累积变量,初值为1
41     for (int i = 5; i >= 1 ; i--) {
42       multi *= i;
43     }
44    // System.out.println(multi);
45 
46     //在控制台输出所有的”水仙花数”
47     // 1. 这样一个三位数[100 999]: 各位上的数字的立方和的值等于该数字本身
48     int count = 0;
49     for (int i = 100; i < 1000; i++) {
50       //判断一个数字i,是否是水仙花数
51 
52       //数位拆解得到各位的数字
53       //个位数字
54       int m = i % 10;
55       //十位数字
56       int n = i / 10 % 10;
57       //百位数字
58       int b = i / 100;
59 
60       if (m * m * m + n * n * n + b * b * b == i) {
61         //是水仙花数
62         //System.out.println(i);
63         count++;
64       }
65     }
66     System.out.println(count);
67 
68 
69 
70   }
71 
72 }

while循环语句格式:

   初始化语句;

   while (条件判断语句) {

    循环体语句;

   }

执行流程: 

  和for循环一模一样

  • for循环和while循环的联系

for循环和while循环几乎可以在任何场景下,作等价替换

  • for循环和while循环的区别

直观来说,for循环适合针对一个范围判断进行操作(循环次 数比较明确),for循环适合针对一个范围判断进行操作 (循环次数比较明确)

 1 public class WhileDemo {
 2 
 3   public static void main(String[] args) {
 4 
 5     // 我国最高山峰是珠穆朗玛峰:8848m,我现在有一张足够大的纸张,厚度为:0.01m。
 6     // 请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
 7 
 8     //初始化语句 纸张的初始化高度
 9     double height = 0.01;
10     int count = 0;
11     while (height < 8848) {
12       height *= 2;
13       count++;
14     }
15     System.out.println("次数是:" + count + "---- height " + height);
16 
17 
18   }
19 
20 }

do …while循环语句格式

初始化语句;

do {

  循环体语句;

} while (条件判断)

执行流程: do while 循环结构与while循环结构比,略有不同

1. 执行初始化语句
2. 不管是否满足循环条件,都首先执行一次循环体中的代码
3. 之后的执行流程就和for while

public class DoWhileDemo {

  public static void main(String[] args) {

    //先执行循环体,在判断
    int i = 10;
    do {
      System.out.println(i);
      i++;
    } while (i > 11);

    //对比while循环,先判断在执行循环体
    i = 10;
    while ( i > 11) {
      System.out.println(i);
      i++;
    }


  }

}

3种循环结构的综合比较:

3种循环中,for循环和while循环等价

do … while循环与其他两种循环结构相比,略有不同,因为do…while结构可保证循环体至少执行一次

注意事项:

  1. 实际使用时,只要达到预期的效果,用哪个都可以
  2. 如非特殊情况,要注意不要规避死循环问题,如: for(;;) 或 while(true),
  3. 死循环并非不能使用(学习多线程时解释)
public class Compare {

  public static void main(String[] args) {

    for (;;){
      System.out.println("你好 dead loop");
    }

    //while(true)

  }

}
  • 请输出一个4行5列的星星(*)图案。
  • 请输出如下图形
  • *
  • **
  • ***
  • ****
  • *****
  • 在控制台输出九九乘法表。
 1 package com.controlflow.recycle;
 2 
 3 /**
 4  *
 5  *  1.请输出一个4行5列的星星(*)图案。
 6  *    *****
 7  *    *****
 8  *    *****
 9  *    *****
10     2.请输出如下图形
11      *
12      **
13      ***
14      ****
15      *****
16     3.在控制台输出九九乘法表。
17 
18  */
19 public class Exercise {
20 
21   public static void main(String[] args) {
22     //1.请输出一个4行5列的星星(*)图案。
23     //重复输出5行*
24     //for(int i = 0; i < 4; i++) {
25     //
26     //  //重复输出每一行的*
27     //  for (int j = 0; j < 5; j++) {
28     //    System.out.print("*");
29     //  }
30     //  //换行输出下一行
31     //  System.out.println();
32     //}
33     //
34     ////输出三角形的*
35     //for (int i = 1; i <= 5; i++) {
36     //
37     //  //控制输出每一行的*
38     //  for (int j = 1; j <= i; j++) {
39     //    System.out.print("*");
40     //  }
41     //  System.out.println();
42     //}
43 
44     //在控制台输出9x9乘法表
45     // 1*1=1
46     // 1*2=2  2*2=4
47     // 1*3=3  2*3=6  3*3=9
48 
49     for (int i = 1; i <= 9 ; i++) {
50 
51       //控制每一行输出的表达式
52       for (int j = 1; j <= i ; j++) {
53         //内存循环中的每一次执行,输出的是一个表达式
54         System.out.print(j + "x" + i + "=" + j * i + "  ");
55       }
56       //换行
57       System.out.println();
58 
59     }
60   }
61 
62 }

补充:

 1 package com.controlflow.recycle;
 2 
 3 /**
 4  *
 5  * 有一种循环的写法, 针对数组的遍历: Colletcion
 6  * for(数据类型 变量名(标识符) : 数组名) {
 7  *
 8  * }
 9  *
10  */
11 public class Supplement {
12 
13   public static void main(String[] args) {
14     // 定义一个数组
15     int[] array = {1, 2, 3, 4};
16 
17     //普通遍历
18     for (int i = 0; i < 4; i++) {
19       System.out.println(array[i]);
20     }
21 
22     // 增强形式for循环
23     //
24     // 1, 2, 3, 4
25     for (int element : array) {
26       System.out.println(element);
27     }
28 
29   }
30 
31 }

4.跳转控制语句

  通过学习循环控制语句,我们已经可以完成控制循环体中的Java代码,重复执行。

  但是,循环结构的控制粒度是整个循环语句体,我们可不可以对循环体中的循环体语句,作更加精细的控制呢? 比如,自己控制循环的结束等。

  为了实现对循环结构更加细粒度的控制,我们得通过跳转控制

    • break 中断
    • continue 继续
    • return 返回
  • break的使用场景:
  1. 在选择结构的switch语句中
  2. 在循环语句中(离开使用场景的存在是没有意义的)
  • break的作用:

跳出(终止)单层循环(如果有多层循环,只跳出内层)

结束switch语句

  • 带标签的跳出(多重循环)

格式:标签名: 循环语句

标签名要符合Java的命名规则

 1 public class BreakDemo {
 2 
 3   public static void main(String[] args) {
 4 
 5     //break的基本功能,结束单重循环
 6     //for (int i = 1; i <= 10; i++) {
 7     //  // 输出到5
 8     //  System.out.println(i);
 9     //  if(i == 5) {
10     //    break;
11     //  }
12     //}
13 
14     //离开使用场景的break
15     //for (int i = 0; i < 10; i++) {
16     //  System.out.println(i);
17     //  break;
18     //}
19 
20     for (int i = 0; i < 3; i++) {
21 
22       for (int j = 0; j < 3; j++) {
23         if( j == 2) {
24           break;
25         }
26         System.out.println("i = " + i + " -- " + "j = " + j);
27       }
28     }
29     System.out.println("---------------------------------------");
30     // 终止外层循环
31     outer: //给外层循环定义了个标签(标识符)
32     for (int i = 0; i < 3; i++) {
33       for (int j = 0; j < 3; j++) {
34         if( j == 2) {
35           break outer;
36         }
37         System.out.println("i = " + i + " -- " + "j = " + j);
38       }
39     }
40   }
41 
42 }
  • continue的使用场景:
  1. 在循环语句中
  2. 离开使用场景的存在是没有意义的,必须和if连用
  • continue的作用:

退出循环的一次迭代过程

也可以使用标签

 1 public class ContinueDemo {
 2 
 3   public static void main(String[] args) {
 4 
 5     for (int i = 1; i <= 10; i++) {
 6       if(i == 5) {
 7         //终止,单重循环的一次循环过程
 8         continue;
 9       }
10       System.out.println(i);
11     }
12 
13     //for (int i = 1; i <= 10; i++) {
14     //  //continue 必须和if配合使用
15     //  continue;
16     //  System.out.println(i);
17     //}
18 
19     //i = 0 -- j = 0
20     //i = 0 -- j = 2
21     //i = 1 -- j = 0
22     //i = 1 -- j = 2
23     //i = 2 -- j = 0
24     //i = 2 -- j = 2
25 
26     //i = 0 -- j = 0
27     //i = 1 -- j = 0
28     //i = 2 -- j = 0
29 
30     outer:
31     for (int i = 0; i < 3; i++) {
32 
33       for (int j = 0; j < 3; j++) {
34         if( j == 1) {
35           continue outer;
36           //break;
37         }
38         System.out.println("i = " + i + " -- " + "j = " + j);
39       }
40 
41     }
42 
43 
44   }
45 
46 }

  return关键字不是为了跳转出循环体 ,更常用的功能是结束一个方法(函数),也就是退出一个方法。 跳转到上层调用的方法。这个在方法的使用那里会在详细的讲解。

演示案例: 结束循环其实是结束了main方法

 1 public class ReturnDemo {
 2 
 3   public static void main(String[] args) {
 4 
 5     //return 终止单重循环
 6     //for (int i = 1; i <= 10; i++) {
 7     //  System.out.println(i);
 8     //  if(i == 5) {
 9     //    return;
10     //  }
11     //}
12 
13    //return 终止多重循环
14     for (int i = 0; i < 3; i++) {
15       for (int j = 0; j < 3; j++) {
16         if( j == 2) {
17           return;
18         }
19         System.out.println("i = " + i + " -- " + "j = " + j);
20       }
21     }
22 
23     System.out.println(" hello return");
24   }
25 
26 }

猜你喜欢

转载自www.cnblogs.com/dust2017/p/12676581.html