流程控制语句结构
语句
Java要完成某个功能,需要通过执行语句来完成。例如:输出xx内容,就需要编写输出语句。
语句多了之后,就要控制这些语句执行的过程,是按顺序依次执行,还是用条件控制它们的执行,即有的执行,有的不执行,还是重复执行…,这就需要用到我们的流程控制语句结构。
流程控制语句结构
顺序结构
顺序结构:从上往下依次执行每一个语句。
分支结构
根据条件判断,有选择的执行某个语句,或某些语句。
(1)if-else条件判断
(2)switch-case选择结构
循环结构
“重复”执行某个或某些语句。
class StatementDemo{
public static void main(String[] args){
int a = 1;//①
int b = 2;//②
System.out.println("a = " + a + ",b =" + b);//③
//分支结构
if(a > b){
System.out.println("a的值大");
}else if(a < b){
System.out.println("b的值大");
}else{
System.out.println("a,b的值一样大");
}
//3个分支选择1个执行
//循环结构
for(int i=1; i<=5; i++){
System.out.println("你好");//重复执行5遍
}
}
}
输入和输出语句
输出语句
System.out.println(xxx);//输出内容之后换行
//println()的()中可以空着,表示换行
System.out.print(xxx);//输出内容之后不换行
//print()的()中不可以空着,否则会编译报错
class PrintDemo{
public static void main(String[] args){
System.out.println("hello");//输出完hello会换行
System.out.println("world");//再输出world,再换行
System.out.print("java");//输出完java不换行,光标在a的后面
System.out.print("lalala");//继续输出lalala,仍然不换行,光标在l的后面
System.out.println();//()空着,表示不输出任何内容,仅仅是换行
//System.out.print();//()空着,错误的
System.out.print("");//可以,表示输出一个空字符串,虽然也没有内容
//System.out.print('');//错误,单引号中必须写一个字符,要么是空格,要么是\u0000
}
}
输入语句
在程序运行时,从控制台由用户输入数据到程序中使用。即Java程序要接收用户在控制台输入的数据。
需要借助:java.util.Scanner工具类来完成。
如何使用?
(1)先在所有类的上方加一句:import java.util.Scanner;
import java.util.Scanner; //注意大小写,和空格,标点符号.
(2)声明一个Scanner类型的变量,并且给它new一个Scanner类的对象(关于对象的概念,大家等面向章节再细说)
//所有class的上面
import java.util.Scanner; //这句话的作用,是告诉编译器去java.util包(文件夹)下找Scanner.class文件
class InputDemo{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
//Scanner input 表示声明了一个Scanner类型的变量,input变量名可以自己命名
//Scanner是一个类,属于Java的引用数据类型
//=右边,是new了一个对象,赋值给input变量了,input又称为对象名
}
}
(3)提示用户输入xx信息,并接收用户输入的信息
输入String字符串:input.next();
输入int值:input.nextInt();
输入double值:input.nextDouble();
输入boolean值:input.nextBoolean();
输入long值:input.nextLong();
输入float值:input.nextFloat();
输入char单字符:input.next().charAt(0);
//charAt(0)取字符串的第1个字符
//charAt(1)取字符串的第2个字符
//..
Scanner类型的变量是什么名,后面就什么.next()等
Scanner input = new Scanner(System.in);
System.out.print("姓名:");
String name = input.next();
Scanner shuRu = new Scanner(System.in);
System.out.print("姓名:");
String name = shuRu.next();
(4)释放资源
input.close();
//所有class的上面
import java.util.Scanner; //这句话的作用,是告诉编译器去java.util包(文件夹)下找Scanner.class文件
class InputDemo{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
//Scanner input 表示声明了一个Scanner类型的变量
//Scanner是一个类,属于Java的引用数据类型
//=右边,是new了一个对象,赋值给input变量了,input又称为对象名
System.out.print("姓名:");//提示用户输入姓名
String name = input.next();//接收用户从控制台输入的姓名
System.out.print("年龄:");
int age = input.nextInt();
System.out.print("体重:");
double weight = input.nextDouble();
System.out.print("是否本专业(true/false):");
boolean pro1 = input.nextBoolean();
System.out.print("是否本专业(是/否):");
char pro2 = input.next().charAt(0);
//input.next()先返回接收的字符串
//.charAt(0)从接收的字符串中取第1个字符
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("体重:" + weight);
System.out.println("是否本专业:" + pro1);
System.out.println("是否本专业:" + pro2);
input.close();//释放资源
}
}
//不能写这里 import java.util.Scanner;
class Other{
}
条件判断
单分支条件判断
语法格式:
if(条件表达式){
当条件表达式成立(为true)时,需要执行的语句
}
执行特点:条件成立就执行对应的语句,不成立就不执行。
注意:当if的{}中只有1个语句时,可以省略{},但是一般情况下都是保留的。
案例需求:
从键盘输入你的年龄,如果年龄在[0, 150]范围内,显示年龄的值。如果输入的年龄不在这个范围,输出一句话:年龄输入有误!也可以显示错误的年龄值。
/*
案例需求:
从键盘输入你的年龄,如果年龄在[0, 150]范围内,显示年龄的值。
如果输入的年龄不在这个范围,输出一句话:年龄输入有误!
也可以显示错误的年龄值。
*/
import java.util.Scanner;
class IfDemo{
public static void main(String[] args){
Scanner sca = new Scanner(System.in);
System.out.print("请输入年龄值:");
int age = sca.nextInt();
System.out.println("age = " + age);
if(age<0 || age>150){//年龄不在[0, 150]范围内
System.out.println("年龄输入有误!1");
System.out.println("年龄输入有误!2");
}
sca.close();
}
}
双分支条件判断
语法格式:
if(条件表达式){
当条件表达式成立(为true)时,需要执行的语句1
}else{
当条件表达式不成立(为false)时,需要执行的语句2
}
执行特点:if条件成立,就执行语句1,否则就执行语句2.
注意:当if的{}或else的{}中只有1个语句时,{}也可以省略,一般情况下都保留。
案例需求:
从键盘输入一个整数,判断它是偶数还是奇数,0归为偶数。
/*
案例需求:
从键盘输入一个整数,判断它是偶数还是奇数,0归为偶数。
*/
import java.util.Scanner;
class IfElseDemo{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = input.nextInt();
if(num%2==0){
System.out.println(num +"是偶数");
System.out.println(num +"是双数");
}else{
System.out.println(num +"是奇数");
}
input.close();
}
}
多分支条件判断
语法结构:
if(条件表达式1){
当条件表达式成立1(为true)时,需要执行的语句1
}else if(条件表达式2){
当条件表达式成立2(为true)时,需要执行的语句2
}else if(条件表达式3){
当条件表达式成立3(为true)时,需要执行的语句3
}else if(条件表达式4){
当条件表达式成立4(为true)时,需要执行的语句4
}....
else{
当上述条件表达式都不成立(为false)时,需要执行的语句n+1
}
执行特点:
(1)先判断if(条件表达式1),如果成立,就执行对应的语句1,后面的条件和分支就不看了,不执行了。
(2)如果if(条件表达式1)不成立,继续判断if(条件表达式2),如果条件2成立,就执行对应的语句2,后面的条件和分支就不看了,不执行了。
(3)如果if(条件表达式2)也不成立,继续判断if(条件表达式3),如果条件3成立,就执行对应的语句3,后面的条件和分支就不看了,不执行了。
(4)以此类推
(5)当以上所有条件都不成立,执行最后的else分支。
注意:当if的{}或else的{}中只有1个语句时,{}也可以省略,一般情况下都保留。
案例需求:
从键盘输入成绩,有效的成绩范围是[0,100],
如果输入的成绩不在[0,100]范围,提示用户输入成绩错误!
如果输入的成绩是100,提示成绩满分;
如果输入的成绩是[80,99],提示成绩优秀;
如果输入的成绩是[70,79],提示成绩良好;
如果输入的成绩是[60,69],提示成绩及格;
如果输入的成绩是[0,59],提示成绩不及格。
/*
案例需求:
从键盘输入成绩,有效的成绩范围是[0,100],
如果输入的成绩不在[0,100]范围,提示用户输入成绩错误!
如果输入的成绩是100,提示成绩满分;
如果输入的成绩是[80,99],提示成绩优秀;
如果输入的成绩是[70,79],提示成绩良好;
如果输入的成绩是[60,69],提示成绩及格;
如果输入的成绩是[0,59],提示成绩不及格。
*/
import java.util.Scanner;
class IfElseIfDemo{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.print("请输入成绩[0,100]:");
int score = input.nextInt();
/*
if(score<0 || score>100){
System.out.println("输入成绩错误!");
}else if(score == 100){
System.out.println("满分");
}else if(score>=80 && score<=99){
System.out.println("优秀");
}else if(score>=70 && score<=79){
System.out.println("良好");
}else if(score>=60 && score<=69){
System.out.println("及格");
}else if(score>=0 && score<=59){
System.out.println("不及格");
}//以上写法也对*/
if(score<0 || score>100){
System.out.println("输入成绩错误!");
}else if(score == 100){
System.out.println("满分");
}else if(score>=80){//当条件判断到这里,说明上面2个条件不成立,0<=score<100
System.out.println("优秀");
}else if(score>=70){//当条件判断到这里,说明上面3个条件不成立,0<=score<80
System.out.println("良好");
}else if(score>=60){//当条件判断到这里,说明上面4个条件不成立,0<=score<70
System.out.println("及格");
}else{
System.out.println("不及格");
}//以上写法也对
/*
if(score<0 || score>100){
System.out.println("输入成绩错误!");
}
if(score == 100){
System.out.println("满分");
}
if(score>=80 && score<=99){
System.out.println("优秀");
}
if(score>=70 && score<=79){
System.out.println("良好");
}
if(score>=60 && score<=69){
System.out.println("及格");
}
if(score>=0 && score<=59){
System.out.println("不及格");
}//以上写法也对 所有if都要判断*/
input.close();
}
}
选择结构
语法格式:
switch(表达式){
case 常量值1:
语句1;
【break;】
case 常量值2:
语句2;
【break;】
....
default:
语句n+1;
【break;】
}
执行特点:
(1)入口:
A:当switch(表达式)的值与某个case后面的常量值相等了,就从这个case进入;
B:当switch(表达式)的值与所有case后面的常量值都不相等,就找default进入。
两种入口,无论default在哪里,都是先找case,如果case有匹配,就从case进入,没有case匹配,才从default进入。
(2)出口
A:switch结束}
B:break中断
(3)贯穿/穿透
从入口进入switch之后,会一直往下执行,直到遇到出口。可能从上一个case直接穿透到下一个case执行。
也可能从case穿透到default,或从default穿透到case。
switch的语法要求:
- switch()中表达式的结果类型必须是byte,short,int,char四种基本数据类型,或String和枚举(后面面向对象再学习枚举)两种引用数据类型。
- case后面必须写常量值,或常量名,不能是变量名
- case后面的常量值不能重复
switch-case和if-else的区别
-
if-else的适用性更广
- switch-case只能用于 表达式的值 是与几个常量值做比较的时候。
- if-else既可以用于常量值的比较,也可以用于范围的比较等
-
switch-case的效率更高
- if-else是需要从上往下依次判断条件,
- switch-case根据表达式的值,直接找case,因为底层会对所有case做一个索引
- 比喻:大家一起出去玩,住酒店,找某个同学的话,如果用if-else,挨个房间敲门问,这个同学是不是在这个房间
- switch-case相当于有一张名单,记录每个同学在哪个房间,老师就可以直接去对应的房间找他
-
switch-case在某些场景下,可以利用穿透性,简化代码