Java基础教程 - 4 流程控制

时间:2024-05-08 17:10:06

更好的阅读体验:点这里www.doubibiji.com
更好的阅读体验:点这里www.doubibiji.com
更好的阅读体验:点这里www.doubibiji.com

4 流程控制

4.1 分支结构

判断在生活中无处不在,例如我们登录某个系统,需要判断密码是否正确,正确才能登录,否则登录失败。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1 if-else 语句

在 Java 中通过 if else 来进行条件的判断,格式如下:

if (condition) {
  // condition为true时执行的代码块
} else {
  // condition为false时执行的代码块
}

也可以不需要 else

if (condition) {
    // 条件成立,要做的事情
}

if 后面的条件 condition 需要 boolean 类型的值、变量或表达式,也就是 truefalse

举个栗子,判断一个数是否为偶数:

public static void main(String[] args) {
    int num = 5;
    if (num % 2 == 0) {
        System.out.println(num + " 是偶数");
    } else {
        System.out.println(num + " 是奇数");
    }
}

执行结果:

5 是奇数


一般情况下,我们经常通过 关系运算逻辑运算 作为 if 的判断条件。

举个栗子:

public static void main(String[] args) {
  int a = 5;
  if (a > 0 && a < 10)
    System.out.println("a在0~10之间");
}

如果 ifelse 后面只有一条语句,可以省略 {}

2 if-elseif-else 语句

if-else 只能进行是和否的判断。

if-elseif-else 可以进行多条件判断。

语法格式:

if (condition1) {
  // condition1为true时执行的语句块
} else if (condition2) {
  // condition2为true时执行的语句块
} else {
  // 所有条件都为false时执行的语句块
}

else-if 可以有多个,最后的 else 可以省略。

当满足一个条件后,其他的条件就不会再判断了,如果所有条件都不满足,会执行 else


下面通过练习来举个栗子:

给出成绩,经过判断,打印出输入的成绩是优秀、良好、中等、及格还是不及格。

public static void main(String[] args) {
  int score = 85;

  if (score < 0 || score > 100) {
    System.out.println("成绩不正确");
  } else if (score >= 90) {
    System.out.println("优秀");
  } else if (score >= 80) {
    System.out.println("良好");
  } else if (score >= 70) {
    System.out.println("中等");
  } else if (score >= 60) {
    System.out.println("及格");
  } else {
    System.out.println("不及格");
  }
}

上面的输出结果为:良好


重新修改一下程序,读取键盘的输入作为值,这里用到读取键盘输入,需要用到 Scanner 类,所以需要使用 import 进行导入,import 的知识点,后面再讲解。

import java.util.Scanner;

public class HelloJava {
    public static void main(String[] args) {
        // 声明一个Scanner,用于读取键盘的输入
        Scanner scan = new Scanner(System.in);
        // 读取的输入
        int score = scan.nextInt();

        if (score < 0 || score > 100) {
            System.out.println("成绩不正确");
        } else if (score >= 90) {
            System.out.println("优秀");
        } else if (score >= 80) {
            System.out.println("良好");
        } else if (score >= 70) {
            System.out.println("中等");
        } else if (score >= 60) {
            System.out.println("及格");
        } else {
            System.out.println("不及格");
        }
    }
}

nextInt() 表示以整形数据的形式读取键盘输入。当程序执行到 scan.nextInt(); 的时候,程序会阻塞在这里,等待用户的输入,输入完成,才会继续执行。


if-else语句都是可以相互嵌套的,可以在 if-else 判断中再进行 if-else 判断。

举个栗子:

public static void main(String[] args) {
    int x = 10;
    int y = 20;

    if (x > 5) {
        if (y > 15) {
            System.out.println("x 大于 5,y 大于 15");
        } else {
            System.out.println("x 大于 5,y 小于等于 15");
        }
    } else {
        if (y > 10) {
            System.out.println("x 小于等于 5,y 大于 10");
        } else {
            System.out.println("x 小于等于 5,y 小于等于 10");
        }
    }
}

3 三目运算符

假设现在有两个数字,我们希望获得其中较大的一个,那么可以使用 if-else 语句,例如:

public static void main(String[] args) {
    int a = 4;
    int b = 5;

    int max;
    if (a > b)
        max = a;
    else
        max = b;
    System.out.println("最大值为:" + max);		// 最大值为:5
}

我们可以使用三目运算符来完成上面的功能,代码会更简洁的写法:

public static void main(String[] args) {
    int a = 4;
    int b = 5;

    int max = a > b ? a : b;
    System.out.println("最大值为:" + max);		// 最大值为:5
}

int max = a > b ? a : b; 的意思是:先判断 a > b,如果成立,就返回 a,不成立就返回 b

代码简洁了确实很多。能用三目运算符的地方都可以使用 if-else 代替。

4 switch语句

switch语句也是一种判断语句,通常用于对多个可能的值进行比较。switch语句的语法如下:

switch (value) {
  case value1:
    // value == value1 时执行的代码块
    break;
  case value2:
    // value == value2 时执行的代码块
    break;
  default:
    // value 不等于上面所有的case 时执行的代码块
}

注意:switch(value) 中的value,只能是byte、short、char、int、枚举类型(后面再讲)、String类型这六种数据类型

以下是一个示例代码,通过数字判断季节:

public static void main(String[] args) {
    int day = 2;
  
    switch (day) {
        case 1:
            System.out.println("春季");
            break;
        case 2:
            System.out.println("夏季");
            break;
        case 3:
            System.out.println("秋季");
            break;
        case 4:
            System.out.println("冬季");
            break;
        default:
            System.out.println("错误的季节");
    }
}

day 满足哪个 case,就会执行哪个 case 后面的代码。

执行结果:

夏季

注意,每个case后,都需要进行 breakreturn,否则会跳到下一个 case

举个栗子:

public static void main(String[] args) {
    int day = 2;
    switch (day) {
        case 1:
            System.out.println("春季");
            break;
        case 2:
            System.out.println("夏季");
        case 3:
            System.out.println("秋季");
        case 4:
            System.out.println("冬季");
            break;
        default:
            System.out.println("错误的季节");
    }
}

因为 case 2 没有 break,所以执行完成,会跳到 case 3 执行,执行完 case 3 没有 breakreturn,会继续跳到 case 4执行,执行完成,case 4break,则跳出。

执行结果:

夏季

秋季

冬季


如果对多个 case 的处理是一样的,就可以将 break 省略。

例如下面的代码中,day 为1,2,3,打印的都是秋季。

public static void main(String[] args) {
    int day = 2;
    switch (day) {
        case 1:
        case 2:
        case 3:
            System.out.println("秋季");
        case 4:
            System.out.println("冬季");
            break;
        default:
            System.out.println("错误的季节");
    }
}

4.2 循环语句

循环在日常生活中也很常见,例如我们要重复做某件事,就需要用到循环,循环不停的做某件事。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

举个栗子,每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?

1 for 循环

for循环是一种常用的循环语句,可以指定循环变量的初始值、终止条件和步长。

for循环的语法如下:

// 对应下面的各个部分
for(①初始化部分; ②循环条件部分; ④迭代部分){
    ③循环体部分;// 执行过程是①-②-③-④-②-③-④-②-③-④......②
// 执行①,然后执行②,判断②是否成立,如果成立,执行③,③执行完成,执行④,④执行完成,再次判断②是否成立,成立继续一轮循环,执行③,②不成立,退出循环。

举个栗子:

public static void main(String[] args) {
  for (int i = 1; i <= 5; i++) {
    System.out.println(i);
  }
}

先执行 int i = 1,定义一个变量 i ,然后执行 i <= 5 ,判断 i 是否小于等于5,如果为 true,则执行循环体中的代码 System.out.println(i); ,执行完循环体中的代码,执行 i++ ,然后再次执行 i <= 5 ,判断i 是否小于等于5,直到 i <= 5 不满足,则终止循环。

打印结果:

1

2

3

4

5

再举个例子:

for (int i = 1, j = 10; i <= 5 && j > 0 ; i++, j--) {
    System.out.println(i + j);
}

从上面可以看出,初始化可以定义多个变量,但是变量的类型要一样。


使用 for 循环也是可以定义死循环的。

什么是死循环,就是一直循环,不会终止的循环。

举个栗子:

下面的循环中,不执行步长的增长,i 始终为1,则 i <= 5 永远成立,所以循环不会终止。

for (int i = 1; i <= 5;) {
    System.out.println(i);
}

还可以这样写:

int i = 0;
for (;;) {
    System.out.println(i++);
}

上面的 for 循环会一直执行,不停的打印 i 的值,i 的值会一直增长。

在实际的开发中,for 循环是用的最多的。

2 while 循环

可以使用 while进行循环操作。

while 循环的语法:

while (condition) {
  // condition为真时执行的代码块
}

代码执行到while,会判断是否满足条件,如果满足,就会进入while循环,执行满足条件要做的事情,执行完成,会重新判断while后面的条件,如果满足会继续循环,如果不满足就不在进入循环。


回到一开始的提问:每天向小红送一条玫瑰花,坚持送100天,这个应该怎么实现呢?

public static void main(String[] args) {
  int i = 1;
  while (i <= 100) {
      System.out.println("第" + i +"天,送你一朵玫瑰花");
      i += 1;
  }
}

首先我们定义了一个变量 i ,用来记录当前是第几天。

我们一开始定义了 i 为 1,执行到 while 循环时,先判断 i 是否小于等于100,如果小于等于100,则进入到循环,打印语句,然后执行 i += 1;i 加1,然后再执行while后面的条件判断,判断 i <= 100,这样一直循环执行,当 i = 101时,刚好已经执行了100次,且不再满足 i < =100,此时终止循环。

注意,一定要对 i 进行累加,如果 i 不进行累加,永远会满足 i <= 100,那么循环将永远不会结束,变成死循环。

执行结果:

第1天,送你一朵玫瑰花

第2天,送你一朵玫瑰花

……

第99天,送你一朵玫瑰花

第100天,送你一朵玫瑰花


我们在计数的时候,i 也可以从0开始,例如:

public static void main(String[] args) {
  int i = 0;
  while (i < 100) {
      System.out.println("第" + (i + 1) + "天,送你一朵玫瑰花");
      i += 1;
  }
}

判断的条件的设定是很灵活的,根据实际需求来就可以了,不是一成不变的。


练习:计算从1累加到100的和

public static void main(String[] args) {
  int sum = 0; 										// 定义一个变量,存储累加的和
  int i = 1; 											// 定义一个变量,标识累加到几了,从1开始累加

  while (i <= 100) {
      sum += i; 										// 将和累加
      i += 1; 											// 将i加1,继续累加
  }

  System.out.println("1~100的和为:" + sum); 		// 打印最终的结果
}

执行结果:

1~100的和为:5050

使用 while 循环的地方都可以使用 for 循环代替。

3 do-while 循环

do...while 循环与 while 循环的区别在于,do...while 循环先执行一次循环体中的代码,再检查条件是否为真。如果条件为真,则继续执行循环体中的代码。

do...while 循环的语法如下:

do {
  // 循环体中的代码块
} while (condition);

举个栗子,再送一遍花:

public static void main(String[] args) {
  
  int i = 1;

  do {
      System.out.println("第" + i + "天,送你一朵玫瑰花");
      i += 1;
  } while (i <= 100);
  
}

4 循环嵌套

循环是可以相互嵌套的,whilefor 循环中可以再次嵌套 whilefor 循环。

例如每天给小红送10多玫瑰花,坚持100天。

public static void main(String[] args) {
  
  int day = 1; // 记录第几天
  while (day <= 100) {			// 外层循环用于循环天数
      for (int roseCount = 1; roseCount <= 10; roseCount++) {			// 内层循环用于循环花的朵数

          System.out.println("第" + day + "天,第" + roseCount + "朵玫瑰花");
      }

      day += 1; // 天数+1
  }
  
}

forwhiledo-while 循环都可以进行多层嵌套。

一般我们使用 for 循环是最多的,要简洁一些:

public static void main(String[] args) {
      for (int day = 1; day < 100; day++) {			// 外层循环用于循环天数
          for (int roseCount = 1; roseCount <= 10; roseCount++) {			// 内层循环用于循环花的朵数
              System.out.println("第" + day + "天,第" + roseCount + "朵玫瑰花");
          }
      }
  }

5 中断循环

我们在前面终止循环,主要是靠不满足条件时自动跳出。这样的话,必须每一次的循环都执行完成,到达条件判断的时候才能跳出。

但是有时候,我们不得不提前退出循环,或者终止当前的循环继续后面的循环,这个时候就需要 breakcontinue 关键字了。


break 语句

break 关键字用于直接结束当前所在的循环。


举个栗子:

如果一个循环,想在执行第三次的时候跳出:

public static void main(String[] args) {
    int i = 0;

    while (i < 10) {
        if (i == 3) {
            break;
        }
        System.out.println("i=" + i);
        i++;
    }
}

执行结果:

i=0
i=1
i=2

可以看到 i = 3 时,跳出了循环。

break只会跳出其所在的循环

public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
        for (int j = 0; i < 10; j++) {
            if (j == 3) {
                break;
            }

            System.out.