我们此前已经看到过数据类型的声明、方法的调用和运算表达式,它们都可以认为是程序中的音符,要真正演奏出动人的音乐需要把这些音符有机地编排到一起。这就需要我们控制代码的执行过程了。
Java中存在着三种控制结构:
之前我们写的代码其实都是顺序结构的,即按照先后顺序逐条语句执行的。如果希望某些语句重复执行,或者满足特定条件下才能执行,就需要用到循环结构和选择结构了。
Java中包括三种循环结构:
while
循环do/while
循环for
循环两种选择结构:
if
结构switch
结构之前我们定义了一个表示博客的Post
类,现在让我们来开始来做一个简单的博客应用吧。我们希望可以通过命令行窗口来创建、显示和管理博客。在这个过程中,我们需要用到循环和选择结构。
while 语句将布尔表达式作为循环控制条件,基本形式为:
语法格式如下:
只要布尔表达式为true,循环体会一直执行下去。
布尔表达式一般会含有关系运算符,比如我们计算从1加到100的和,通过while
语句可以这样来写:
我们的博客应用,希望不断地从控制台获得输入,这个时候我们就可以用一个while
循环来实现。我们创建一个BlogApp
的类,代码如下:
package com.tianmaying;
import java.util.Scanner;
public class BlogApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
String command = scanner.next();
System.out.println(command);
if (command.equals("exit")) break; // 这行代码表示如果输入的是exit,则退出循环;if和break马上就会讲解
}
scanner.close();
}
}
Scanner scanner = new Scanner(System.in);
这行代码用以获取控制台输入的工具类实例。
这里我们将while
语句中的布尔表达式设置为true
,即循环体不断执行。那么程序就会不断地等待用户的输入,并且将用户的每一次输入打印出来。
将用户输入看成是命令的话,我们接下来要做的就是让程序识别出各种博客管理相关的命令,并进行相应的程序处理。
对于while
语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
do/while
循环和while
循环相似,不同的是,do/while
循环至少会执行一次。
语法格式如下:
布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。 如果布尔表达式的值为true
,则语句块一直执行,直到布尔表达式的值为false。
从1加到100的计算逻辑,通过do/while
语句写编写则有如下代码:
第三种循环结构是for
循环,是我们最常使用的形式。它在第一次迭代时会进行初始化,随后进行布尔表达式值得测试,测试通过执行循环体,循环体执行完毕后会进行步进操作。
语法格式如下:
其执行逻辑如下:
从1加到100的计算逻辑,通过for
语句写编写则有如下代码:
Java利用for
语句引入了更为简单的方式来进行Java数据及容器的操作。通过这种方式,我们可以不用引入额外的控制变量。以遍历数组为例: 一般的for
循环:
String[] sentences = {"hello", "thank u", "thank u very much"};
for (int index = 0; index < sentences.length; index++) {
System.out.println(sentences[index]);
}
我们可以采用如下方式进行简化:
String[] sentences = {"hello", "thank u", "thank u very much"};
for (String sentence : sentences) {
System.out.println(sentence);
}
if
用以进行条件判断,根据判断结果分支执行代码。
语法格式如下:
if语句后面可以跟else语句,当if语句的布尔表达式值为false时,else语句块会被执行。
语法格式如下:
if
语句后面可以跟else if
语句。
语法格式如下:
if (布尔表达式1) {
//布尔表达式1的值为true将执行的代码
} else if (布尔表达式2) {
//布尔表达式1为false,布尔表达式2为true将执行的代码
} else if (布尔表达式3) {
//布尔表达式1为false,布尔表达式2为false,布尔表达式3的值为true将执行的代码
} else {
//以上布尔表达式都不为true将执行的代码
}
需要注意以下几点:
if
语句至多有1个else
语句,else
语句在所有的else if
语句之后if
语句可以有若干个else if
语句,它们必须在else
语句之前else if
语句检测为true
,其他的else if
以及else
语句都将跳过执行比如,计算从1到100的所有偶数之和,可以在for
循环体中加入if
判断:
switch语句判断一个变量与一系列值中某个值是否相等,如果相等则执行对应分支的代码。
语法格式如下:
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//可以有任意数量的case语句
default : //可选
//语句
}
计算从1到100的所有偶数之和,通过switch
语句可以这样实现:
int sum = 0;
for(int i = 0; i <= 100; i++) {
int result = i % 2;
switch (result) {
case 0:
sum += i;
break;
case 1:
break;
}
}
switch
语句具有如下规则:
switch
语句中的变量类型只能为String
、byte
、short
、int
或者char
。switch
语句可以拥有多个case
语句,每个case
后面跟一个要比较的值和冒号。case
语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。case
语句之后的语句开始执行,直到break
语句出现才会跳出switch
语句。break
语句时,switch
语句终止。程序跳转到switch
语句后面的语句执行。case
语句不必须要包含break
语句。如果没有break
语句出现,程序会继续执行下一条case
语句,直到出现break
语句。switch
语句可以包含一个default
分支,该分支必须是switch
语句的最后一个分支。default
在没有case
语句的值和变量值相等的时候执行。default
分支不需要break
语句。我们已经知道break
可以跳出switch
语句,break
也具有跳出循环的功能。
回到我们的BlogApp
,因为while
语句中的布尔表达式设置为true
,意味着这个程序永远不会结束,那我们如何能够结束这个循环呢?我们可以通过break语句来跳出循环。
比如当用户输入exit时,我们就让其跳出循环。
package com.tianmaying;
import java.util.Scanner;
public class BlogApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
String command = scanner.next();
System.out.println(command);
if (command.equals("exit")) {
break; //跳出循环
}
}
scanner.close();
}
}
执行程序,当我们在控制台输入exit时,程序将会退出。
continue
用于在循环控制结构中,让程序立刻跳转到下一次循环。在for
循环中,continue
语句使程序立即跳转到控制变量更新语句。在while
或者do/while
循环中,程序立即跳转到布尔表达式的判断语句。
比如,我们计算从1到100的所有偶数之和,我们也可以通过加入continue
语句来实现:
int sum = 0;
for(int i = 0; i <= 100; i++) {
if (i % 2 == 1) {
continue; // 如果是奇数,则立刻跳转到下一次循环,不做累加
}
sum += i;
}
return
也表示无条件分支,它包含两种用途:
return
后面跟一个值或者变量,指定一个方法的返回值return;
语句,后面不跟任何值或者变量,表示退出当前方法比如我们可以定义一个方法来计算从1到100之和,然后将其返回:
public static int sumOfNumbers() {
int sum = 0;
for(int i = 0; i <= 100; i++) {
sum += i;
}
return sum;
}
接下来我们来设计一下博客应用,让它可以管理博客。
用户可以输入以下命令:
命令 | 功能 |
---|---|
create | 创建博客 |
list | 显示博客列表 |
show | 显示博客内容 |
delete | 删除博客 |
exit | 推出程序 |
我们这里通过各种控制结构,先把代码骨架建立起来,具体的功能,我们后面再来逐一实现。
package com.tianmaying;
import java.util.Scanner;
public class BlogApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) { // 1
String command = scanner.next();
System.out.println(command);
if (command.equals("exit")) { // 2
break; // 3
} else if (command.equals("create")) {
// 处理创建博客的逻辑
} else if (command.equals("list")) {
// 处理显示博客列表的逻辑
} else if (command.equals("show")) {
// 处理显示博客内容的逻辑
} else if (command.equals("delete")) {
// 处理删除博客的逻辑
} else {
continue; // 4
}
}
scanner.close();
}
}
上面的程序:
while
结构来循环读入用户输入if/else
结构来分支处理用户的各种命令break
语句来跳出循环continue
语句来结束一次循环最后在循环外部,程序退出之前,调用了scanner.close()
将输入扫描器关闭。这些代码你都弄明白了,Java程序中的控制结构你就基本理解了。
登录发表评论 登录 注册
为什么这段代码输入后打印两遍?我实在有点懵,请高手详解,谢谢
for循环里的例子简化看不懂。。
是不是目前还没必要深究
诶,突然发现,是不是 for each 的感觉?
String[] sentences = {"hello", "thank u", "thank u very much"};
for (String sentence : sentences) {
System.out.println(sentence);
}
这是什么写法啊?
为什么需要这行代码?不需要可以吗?
前面 6 节课的作业都完成了,为啥没解锁第 7 节课的作业
String[] sentences = {"hello", "thank u", "thank u very much"};
for (String sentence : sentences) {
System.out.println(sentence);
}
String[] sentences = {"hello", "thank u", "thank u very much"};
for (int index = 0; index < sentences.length; index++) {
System.out.println(sentences[index]);
}
谁能解释一下第一段程序,两段是一个意思
定义i = 1;
定义sum = 0;
当i <= 100;执行以下操作{
sum = sum + i;
i = i + 1;
}
因人而异啊,很多有编程基础学全栈开发的同学,一两天就搞定了,不过一般情况下都是一天过一关或者两关的吧
请问这个教程最快多长时间通关呀
谢谢哦
原因应该是switch内部的break只能跳出switch,不能跳出外部的循环。
第六课第一道练习题改成switch分支后总是编译不过,说跳出不循环,请问有遇到这样问题的同学吗?
谢谢提醒,加了一个左括号
6程序的控制流的break的那段代码右括号多了一个
代码片段右上角有一个复制按钮,点那个复制
代码回合行号一起被复制 有点恶心
从1加到100的和
int i = 1; int sum = 0; while (i <= 100) { sum += i; i++; }谁能分析一下这个过程
条件表达式,不同的条件进入不同的分支去执行代码。看最后一节。
这里面布尔表达式2的作用是什么?
一种常用的写法:
while (true) { String command = scanner.next(); System.out.println(command); } 布尔表达式居然可以直接设定T/F啊
@liangliangwqy 你是对的,我以为是
while
循环,do/while
最后确实需要有分号。我没带分号的时候报错哦。
语法格式如下:
do { //循环内容 } while( 布尔表达式 );
这里不需要分号吧
while (i <= 100)
最后少了个分号