流程是指程序运行时,各语句的执行顺序。控制流程就是用来控制程序中各语句执行的顺序。控制流程结构分为顺序结构、选择结构和循环结构三种。
本文主要对Java的控制流程进行简单总结。
块(即复合语句)是指由一对大括号括起来的若干条简单的Java语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。下面就是在main方法块中嵌套另一个语句块的示例:
public static void main(String[] args) {
int n;
...
{
int k;
...
}
}
但是,不能在嵌套的两个块中声明同名变量。
顺序结构是程序中最简单最基本的控制流程结构,就是按照代码的先后顺序,依次执行。顺序结构流程图如下:
代码示例:
public class OrderDemo {
public static void main(String[] args) {
System.out.println("开始");
System.out.println("Hello World");
System.out.println("结束");
}
}
选择结构也被称为分支结构,可根据不同的条件按照不同的选择执行不同的代码。包括if条件语句和switch语句。其中if条件语句有if
、if···else
和if···else if
三种格式。
格式:if(condition) statement
注意:这里的statement可以是一条简单语句也可以是一个块(复合语句)。
if语句控制流程图如下:
执行流程说明:先判断关系表达式的值是true还是false,如果是true则执行语句体,如果是false则不执行语句体。
代码示例:
public class IfDemo {
public static void main(String[] args) {
System.out.println("开始");
int x = 10;
if (x == 10) {
System.out.println("x等于10");
}
if (x == 20) {
System.out.println("x等于20");
}
System.out.println("结束");
}
}
格式:if (condition) statement1 else statement2
if···else语句控制流程图如下:
执行流程说明:先判断关系表达式的值是true还是false,如果是true则执行语句体1,如果是false则执行语句体2。
注意:
else部分是可选的,else子句与最邻近的if构成一组。
三元运算符和if···else语句的情况很相似,在某些情况下应该是可以相互转换。三元运算符的操作都可以使用if语句改进,反之不成立。比如if语句的语句体是一条输出语句的时候,因为三元运算符是一个运算符,必须要求有一个结果返回,而输出语句却不能作为一个返回结果。
代码示例:
public class IfDemo2 {
public static void main(String[] args) {
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//获取两个数据中较大的值
System.out.println("请输入第一个数据:");
int a = sc.nextInt();
System.out.println("请输入第二个数据:");
int b = sc.nextInt();
//定义一个变量接收最大值
int max;
if (a > b) {
max = a;
} else {
max = b;
}
System.out.println("max:" + max);
System.out.println("----------------");
//判断一个数据是奇数还是偶数
System.out.println("请输入你要判断的数据:");
int x = sc.nextInt();
if (x % 2 == 0) {
System.out.println(x + "这个数据是偶数");
} else {
System.out.println(x + "这个数据是奇数");
}
}
}
格式:if (condition1) statement1 else if (condition2) statement2···else statement(n+1)
if···else if语句控制流程图如下:
执行流程说明:判断关系表达式1的值是true还是false,如果是true,就执行语句体1,如果是false,就继续判断关系表达式2的值是true还是false,如果是true,就执行语句体2,如果是false,就继续判断关系表达式3的值是true还是false···如果都不满足,就执行语句体n+1。
代码示例:
public class IfDemo3 {
public static void main(String[] args) {
/*
键盘录入一个成绩,判断并输出成绩的等级。等级如下:
90-100 优秀
80-90 好
70-80 良
60-70 及格
0-60 不及格
*/
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//输入数据
System.out.println("请输入考试成绩:");
int score = sc.nextInt();
if (score < 0 || score > 100) {
System.out.println("输入的成绩有误");
} else if (score >= 90 && score <= 100) {
System.out.println("优秀");
} else if (score >= 80 && score < 90) {
System.out.println("好");
} else if (score >= 70 && score < 80) {
System.out.println("良");
} else if (score >= 60 && score < 70) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
}
}
格式:
switch (表达式) {
case 值1:
语句体1
[break;]
...
case 值n:
语句体n
[break;]
default:
语句体 n+1;
[break;]
}
解释:
swich中表达式的取值:byte、short、int、char、枚举(JDK1.5)、String(JDK1.7)。
case:后面的值就是要和表达式进行比较的值。
break:表示程序到这里中断,跳出switch语句。可以省略但最好不要省略。
default:如果所有的情况都不匹配,就执行这里,相当于if语句中的else。
switch语句控制流程图如下:
执行流程说明:首先计算表达式的值,然后和每一个case进行比较,如果有匹配的就执行对应的语句体,遇到break或执行到switch语句结束处为止。最后,如果没有匹配的,并且有default字句,就执行default的语句体。
注意:
- case子句中的值必须是常量,且所有case子句中的值应该是不同的。
- default可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。
- default并不是一定要放在switch语句最后,它可以出现在switch语句任意位置。
- break可以省略,但是不建议,如果在case分支语句的末尾没有break语句,那么就会接着执行下一个case分支语句,这可能会引发错误。
- 当在switch语句中使用枚举常量时,不必在每个case中指明枚举名,可以由switch的表达式值确定。
代码示例:
public class SwitchDemo {
public static void main(String[] args) {
/*
键盘录入一个数字(1-7),输出对应是星期几
*/
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//输入数据
System.out.println("请输入一个数据:");
int week = sc.nextInt();
//switch判断语句
switch (week) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入的数据有误");
break;
}
}
}
public class SwitchDemo2 {
public static void main(String[] args) {
/*
根据给定的月份,输出对应的季节
*/
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
//输入数据
System.out.println("请输入月份:");
int month = sc.nextInt();
switch (month) {
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("输入的月份有误");
}
}
}
if语句和switch语句各自的使用场景:
循环语句就是在满足一定条件的情况下反复执行某一个操作。包括while循环语句、do···while循环语句和for循环语句。
基本格式:
while (判断条件语句) {
循环体语句;
}
扩展格式:
初始化语句;
while (判断条件语句) {
循环体语句;
控制条件语句;
}
while语句语句控制流程图如下:
执行流程说明:while语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句。
代码示例:
public class WhileDemo {
public static void main(String[] args) {
//求1-100之和
int sum = 0;
int x = 1;
while (x <= 100) {
sum += x;
x++;
}
System.out.println("sum:" + sum);
}
}
基本格式:
do {
循环体语句;
} while (判断条件语句);
扩展格式:
do {
循环体语句;
控制条件语句;
} while (判断条件语句);
do···while语句语句控制流程图如下:
执行流程说明:首先执行初始化语句,然后执行循环体语句,然后执行控制条件语句,然后执行判断条件语句看结果是true还是false,如果是true,回到循环体语句继续循环,如果是false,就结束循环。
代码示例:
public class DoWhileDemo {
public static void main(String[] args) {
//求1-100之和
int sum = 0;
int x = 1;
do {
sum += x;
x++;
} while (x <= 100);
System.out.println("sum:" + sum);
}
}
格式:
for (初始化语句; 判断条件语句; 控制条件语句) {
循环体语句;
}
for语句语句控制流程图如下:
执行流程说明:首先执行初始化语句,然后执行判断条件语句,如果结果是true,就继续循环,如果结果是false,循环结束,继续执行循环体语句之后会执行控制条件语句,然后回到判断条件语句进行判断。
注意:
- 当在for语句的初始化语句(第一部分)中声明了一个变量之后,这个变量的作用域就为for循环的整个循环体。
- 如果在for语句内部声明一个变量,这个变量就不能在循环体之外使用。如果想要在for循环体之外使用控制条件变量的最终值,就要确保这个变量在循环语句的前面且在外部声明。
- 可以在各自独立的不同for循环中定义同名的变量。
- for循环语句只不过是while循环的一种简化形式,while循环可以和for循环可以等价转换。
代码示例:
public class ForDemo {
public static void main(String[] args) {
/*
求5的阶乘,阶乘公式如下:
n! = n*(n-1)!=n*(n-1)*(n-2)*...*3*2*1
*/
//for循环版本
int jc = 1;
//这里的x可以直接从2开始
for (int x = 2; x <= 5; x++) {
jc *= x;
}
System.out.println("5的阶乘是:" + jc);
System.out.println("------------");
//while循环版本
int jc2 = 1;
int y = 2;
while (y <= 5) {
jc2 *= y;
y++;
}
System.out.println("5的阶乘是:" + jc2);
}
}
三种循环语句的区别:
foreach语句是Java5后新增的for语句的特殊简化版本,并不能完全替代for语句,但所有foreach语句都可以改写为for语句。foreach语句可以很方便的遍历数组和集合。格式如下:
for (元素的数据类型 变量名 : 数组或者Collection集合对象) {
循环体语句;
}
执行流程说明:和for循环类似。
注意:
- foreach循环语句的循环变量将会遍历数组或集合中的每个元素,而不需要使用下标值。
- 在很多场合下,还是需要使用传统的for循环。例如,如果不希望遍历集合中的每个元素,或者在循环内部需要使用下标值等。
代码示例:
public class ForeachDemo {
public static void main(String args[]) {
int[] numbers = {
1, 2, 3, 4, 5};
for (int x : numbers) {
System.out.print(x);
}
}
}
Java语言中提供了3种跳转语句,分别是break语句、continue语句和return语句。
break语句用在switch语句和循环语句中,在switch语句中,break用于退出switch语句,在循环语句中,break(不带标签)作用为跳出单层循环,带标签的break语句可以跳出多层循环。带标签的break语句的标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。
注意:
- 事实上,可以将标签应用到任何语句中,甚至可以应用到if语句或者块语句中。
- 带标签的跳转只能跳出语句块,不能跳入语句块。
代码示例:
public class BreakDemo {
public static void main(String[] args) {
//跳出单层循环
for (int x = 0; x < 10; x++) {
if (x == 3) {
break;
}
System.out.println("HelloWorld");
}
System.out.println("over");
System.out.println("-------------");
//带标签的break
wc:
for (int x = 0; x < 3; x++) {
nc:
for (int y = 0; y < 4; y++) {
if (y == 2) {
//break nc;
break wc;
}
System.out.print("*");
}
System.out.println();
}
}
}
continue语句只能用于循环语句中,用于将控制转移到最内层循环的首部,即结束一次循环,继续下一次的循环。还有一种带标签的continue语句,将跳转到与标签匹配的循环首部。代码示例:
public class ContinueDemo {
public static void main(String[] args) {
for (int x = 0; x < 10; x++) {
if (x == 3) {
continue;
}
System.out.println(x);
}
}
}
return即方法返回,主要用于结束一个方法,并把控制权交给调用它的语句。代码示例:
public class ReturnDemo {
public static void main(String[] args) {
getName();
}
public String getName() {
return "ZhangSan";
}
}