【啃透Java基础知识】4Java流程控制

参考资料:《Java 核心技术卷 I》

本章介绍了关于Java流程控制相关的知识。

Java流程控制

Java程序默认是按顺序流程执行的,但编写者可以使用特定的流程控制语句来控制代码执行的顺序。

什么是块?

块是由用大括号括起来的若干条Java语句组成的。如下

1
2
3
4
5
{
    int a = 1;
    int b = 1;
    System.out.println(a + b);
}

块确定了变量的作用域,在块中声明的变量只能在该块中使用。

块也可以嵌套,但嵌套的块中不能重复声明同名变量,如下是错误的:

1
2
3
4
5
6
7
8
{
    int a = 1;
    int b = 1;
    {
    	int a = 2;
    	System.out.println(a + b);
    }
}

条件控制

if-else语句

条件语句即

if(condition)statement

其中当表达式condition的值为true时,执行statement语句。

statement可以使用块来实现执行多条语句。

条件语句还可以如:

if(condition)statement1 else statement2

其中当表达式condition的值为true时,执行statement1语句,否则执行statement2语句。

可以对多个if else语句进行组合:

if(condition1)statement1 elseif(condition2) statement2 ... else statementn

switch语句

switch语句的基本格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
switch(choice){
    case 1:	//当choice的值为1时,执行以下代码,执行到break时跳出switch语句
        ...
        break;
    case 2:	//当choice的值为2时,执行以下代码,执行到break时跳出switch语句
        ...
        break;
    default:	//当choice的值不满足以上所有case时,执行以下代码,执行到break时跳出switch语句
        ...
}

其中choice的类型要与case后的常量相匹配,case后的常量的类型可以是:

  • charbyteshortint的表达式。
  • 枚举常量
  • 字符串字面量
  • 多个字符串,用逗号分隔

除此之外,switch语句还有一种形式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
switch(choice){
    case 1 ->	//当choice的值为1时,执行以下代码,执行到break时跳出switch语句
        ...
        
    case 2 ->	//当choice的值为2时,执行以下代码,执行到break时跳出switch语句
        ...
        
    default ->	//当choice的值不满足以上所有case时,执行以下代码,执行到break时跳出switch语句
        ...
}

可以很容易注意到,这两种形式之间的不同不仅是case后的连接符号不同,即:->,还可以看见第二种形式中执行代码块内没有break语句。

我们先要弄清楚,:形式的switch语句存在一个叫直通的问题。

:形式的switch语句中某个case的代码块不存在break语句,程序在执行完对于的代码块后并不会停止执行并跳出switch语句,而是会接着执行下一个case对应的代码块,直到遇到一个break语句或者执行完default的代码块,而这种现象就叫做直通。这种情况往往不是我们想要看到的,因此通常会在每一个case对应的代码块的末尾添加一个break语句。

->形式的switch语句便没有直通的问题。

switch语句不仅可以用作一般的语句,还可以当成表达式来使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int i = switch(season){
        case "spring" -> 1;
        case "summer" -> 2;
        case "fall" -> 3;
        case "winter" ->{
            System.out.println("I love winter!");
            yield 4;
        }
        default -> 0;
}

可以注意到,switch语句用作表达式时,往往要返回一个值,因此使用->形式的switch语句可以直接在->后接返回值。若想用块来执行多条语句,则需要使用yield关键字来表明返回的值。

注意
:形式的switch语句也可以用作表达式,如何返回一个值呢?需要使用yield关键字来表明返回的值。需要注意的yield可以替代break实现中断操作。

循环控制

循环语句

基本的循环语句有三种:

  • while(condition) statement;
  • do statement while(condition);
  • for(declaration; condition; iteration) statement

其中while语句和do while语句都是当conditiontrue时,循环执行statement

区别是while语句先进行条件的判断,而do while语句先执行一次statement再进行条件的判断。

for语句有三个部分,其中第一部分declaration为控制循环的变量的声明,condition为控制循环的条件判定,iteration为控制循环变量的迭代。

所有的statement都可以用块来实现多语句执行。

技巧

还有一个特殊的循环语句,即for each循环:

for(variable : collection) statement

for each循环可以用来依次处理数组或其他元素集合中的每个元素而不必考虑索引值,它将给定的变量variable设置为集合中的每一个元素(类型需要匹配),然后执行statement。其中collection必须是一个数组或是一个实现了Iterable接口的类对象。

循环中断语句

  • break语句,会中断当前的循环。利用标签可以实现中断外围循环,如
1
2
3
4
5
6
7
label1:
for(int i=0;i<10;i++){
    label2:
    for(int j=0;j<5;j++){
        break label1; //直接退出整个循环
    }
}
  • continue语句,会跳过当前循环。利用标签可以实现跳过外围循环,如
1
2
3
4
5
6
7
label1:
for(int i=0;i<10;i++){
    label2:
    for(int j=0;j<5;j++){
        continue label1; //直接跳转到 i++ 环节
    }
}
wuqimotou 微信微信
0%