流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:
- 顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
- 分支结构
根据条件,选择性地执行某段代码。
有if…else和switch-case两种分支语句
- 循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
由于顺序结构,我们从一开始就接触过,这里主要分支结构和循环结构
1.if-else结构
if-else可以细分为三种格式
(1) if (条件表达式){
执行代码块;
}
(2) if (条件表达式){
执行代码块1;
}else{
执行代码块2;
}
(3) if (条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
}
……
else{
执行代码块n;
}
1.2 if-else使用说明
- 条件表达式必须是布尔表达式(关系表达式或逻辑表达式)、布尔变量
- 语句块只有一条执行语句时,一对{}可以省略,但建议保留
- if-else语句结构,根据需要可以嵌套使用
- 当if-else结构是“多选一”时,最后的else是可选的,根据需要可以省略
- 当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下 / 子上父下“
1.3if-else语句的应用
练习1:
public class AgeTest{
public static void main(String args[]){
int age = 75;
if (age< 0) {
System.out.println("不可能!");
} else if (age>0&&age<18) {
System.out.println("你还需要学习!");
} else if (age>=18&&age<60) {
System.out.println("你已经成年了!");
}else {
System.out.println("你可以退休了");
}
}
}
练习2:
public class day01 {
public static void main(String[] args) {
int x = 4;
int y = 1;
if (x > 2) {
if (y > 2)
System.out.println(x + y);
System.out.println("会是我吗?");
} else
System.out.println("x is " + x);
}
}//结果:会是我吗?
练习3:
public class day01 {
public static void main(String[] args) {
boolean b = true;
//如果写成if(b=false)能编译通过吗?如果能,结果是?
if(b == false)
System.out.println("a");
else if(b)
System.out.println("b");
else if(!b)
System.out.println("c");
else
System.out.println("d");
}
}//结果:b
2.switch-case
2.1 简介:
switch-case语句是一种多分支选择语句,它可以根据某个变量的值,从多个不同的选项中选择一个执行。
其基本语法如下:
switch (expression) {
case value1:
// 对应的语句块
break;
case value2:
// 对应的语句块
break;
...
default:
// 对应的语句块
}
switch语句中的expression可以是任何基本数据类型或枚举类型,case语句中的value1、value2等必须是常量或字面量,且类型必须与expression相同。当expression的值与某个case语句中的value相等时,会执行该case语句后的语句块,如果没有遇到break语句,会继续执行后续所有的语句块。如果expression的值与所有的case语句中的value都不相等,则会执行default语句块,如果没有default语句块,则不执行任何语句。
2.2switch-case演示
下面是一个简单的例子,根据用户输入的数字,输出相应的中文数字。
import java.util.Scanner;
public class SwitchCaseDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字(1-5):");
int num = scanner.nextInt();
switch (num) {
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;
default:
System.out.println("输入错误!");
}
}
}
//当用户输入1~5之间的数字时,程序会输出相应的中文数字,如果输入其他数字,则会输出“输入错误!”。
2.3switch语句的注意事项
- switch(表达式)中表达式的值必须是下述几种类型之一:byte,short, char,int,枚举 (jdk 5.0),String (jdk 7.0);
- case子句中的值必须是常量,不能是变量名或不确定的表达式值;
- 同一个switch语句,所有case子句中的常量值互不相同;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到 switch结尾
- default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
2.3default关键字
在switch-case语句中,case关键字用于表示每一个分支,而default关键字则用于表示当所有分支都不满足时,执行的默认分支。
具体来说,当switch语句中的表达式值与某个case分支的值相等时,程序会跳转到该分支执行相应的代码块,如果没有遇到break语句,则会继续执行后续的分支。当所有的分支都不满足时,程序会跳转到default分支执行其代码块。如果没有default分支,则程序不会执行任何代码。
在switch-case语句中,default分支可选,可以根据具体情况选择是否需要使用。如果没有特别的需求,建议在switch-case语句中始终包含default分支,以防止程序出现异常。在default分支中,通常会输出一条错误信息或者抛出一个异常,以提醒程序员或用户输入的值不符合要求。
下面是一个简单例子:
import java.util.Scanner;
public class SwitchCaseDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字(1-5):");
int num = scanner.nextInt();
switch (num) {
case 1:
System.out.println("你输入的是1");
break;
case 2:
System.out.println("你输入的是2");
break;
case 3:
System.out.println("你输入的是3");
break;
case 4:
System.out.println("你输入的是4");
break;
case 5:
System.out.println("你输入的是5");
break;
default:
System.out.println("输入错误,请输入一个1-5之间的数字");
}
}
}
//在上面的例子中,如果用户输入的是1~5之间的数字,则会输出相应的提示信息,如果输入的是其他的数字,则会输出“输入错误,请输入一个1-5之间的数字”。
3.Scanner类(补充)
Scanner类是一种用于读取用户输入数据的工具类,它可以获取来自键盘或文件等输入源的基本数据类型值(例如整数、浮点数、字符串等)。使用Scanner类可以极大地简化输入数据的处理流程,减少编程工作量。
3.1Scanner类使用步骤
- 导入Scanner类:在Java程序的开头部分,需要导入java.util.Scanner包,以便使用Scanner类。
import java.util.Scanner;
- 创建Scanner对象:在程序中创建Scanner对象时,需要指定要从哪个输入源读取数据。通常情况下,我们使用System.in参数指定从标准输入(即键盘)读取数据,例如:
Scanner scanner = new Scanner(System.in);
-
读取输入数据:使用Scanner类提供的方法来读取不同类型的输入数据,下面是一些Scanner类中的方法
next() 读取一个字符串,遇到空格或换行符即停止,并返回读取到的字符串。 nextLine() 读取一行字符串,直到读取到换行符为止,并返回读取到的字符串。与next()方法不同的是,该方法可以读取包括空格在内的整行内容。 nextInt() 读取一个整数值,并返回读取到的整数。 nextDouble() 读取一个浮点数值,并返回读取到的浮点数。 hasNext() 判断输入流是否还有下一个元素,如果有返回true,否则返回false hasNextInt() 判断输入流中下一个元素是否为整数类型,如果是返回true,否则返回false。 hasNextDouble() 判断输入流中下一个元素是否为浮点类型,如果是返回true,否则返回false。 4.调用Scanner类中的close(),关闭 Scanner对象
scanner.close();//手动进行关闭
-
调用该方法是因为Scanner类在读取文件或者网络流时,会占用对应的文件或者网络资源,如果不及时释放这些资源,会导致资源浪费和内存泄漏等问题。另外,如果Scanner对象没有关闭,则可能会导致一些重要信息未能及时销毁,从而引发安全隐患。
下面是一个Scanner类的演示
import java.util.Scanner;
public class SumCalculator {
public static void main(String[] args) {
int num1, num2, sum;
Scanner input = new Scanner(System.in);
System.out.print("请输入第一个整数:");
num1 = input.nextInt(); // 从键盘读取一个整数
System.out.print("请输入第二个整数:");
num2 = input.nextInt(); // 从键盘读取另一个整数
sum = num1 + num2; // 计算两数之和
System.out.println("这两个整数的和是:" + sum);
input.close();//手动进行关闭
}
}