03 Java流程控制-分支(if+switch+变量类型)

简介: 03 Java流程控制-分支(if+switch+变量类型)

3 流程控制语句(选择分支)

3.1 流程控制语句分类
  • 计算机中任何简单或复杂的程序都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。
  • 顺序结构
  • 程序中的各个操作是按照它们在源代码中的排列顺序依次执行的。
  • 选择结构
  • 根据某个特定的条件进行判断后,选择其中一支执行。
  • 循环结构
  • 反复执行某个或某些操作,直到条件为假时才停止循环。
  1. 顺序语句
  2. 分支语句
  • if分支
  • switch选择
  1. 循环语句
  • for 循 环 (重点)
  • while 循 环
  • do while循环
3.2 if分支语句
3.2.1 简单if分支(单分支)

语法:

if(逻辑条件(boolean类型)){

满足逻辑条件执行的代码

}

字符串比较字符串比较使用equals()方法

import java.util.Scanner;
public class Demo {
    //要求控制台输入是否中奖
    public  static  void  main(String[]  args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入是否中奖?y/n");
        String answer = sc.next();
        if (answer.equals("y")){
            System.out.println("买车、买房、旅游");
        }else
            System.out.println("继续购买");
        System.out.println("程序结束");
    }
}
3.2.1.1 Math.random 产生随机数

Math.random产生的是0-1之间的小数(含0不含1)

*产生随机数int random=(int)(Math.random()10);

//输入四位数字的会员号的百位数字等于产生的随机数字即为幸运会员,提示恭喜您中奖了,否则没中奖。
import java.util.Scanner;
public class Demo30 {
    public  static  void  main(String[]  args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入四位数字会员卡号的百位数字");
        int num = sc.nextInt();
        //获取百位数字
        int baiWei = num/100%10;
        //随机产生一个数字Math.random()   产生一个0-1之间的小数 含0不含1 
        int ran=(int)(Math.random()*10);
        if (baiWei==ran){
            System.out.println("恭喜您中奖了");
        }else
            System.out.println("谢谢惠顾");
        System.out.println("程序结束");
    }
}
3.2.2 if…else分支

语法:

if(逻辑条件){

满足逻辑条件执行的代码

}else{

不满足逻辑条件执行的代码

}

需求:如果用户名为admin、密码为123456,则跳转首页,否则跳转登录页面

//案例:如果用户名为admin、密码为123456,则跳转首页,否则跳转登录页面
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.next();
        System.out.println("请输入密码");
        String password = sc.next();
        if(username.equals("admin") && password.equals("123456")){
            System.out.println("跳转首页");
        }else{
            System.out.println("跳转登录页面");
        }
    }
}

需求:在控制台输入一个年份,判断这个年份是否是闰年,如果是闰年输出年和年份,如果不是闰年输出平年和年份

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个年份:");
        int year = input.nextInt();
        if((year%4==0 && year%100!=0) || (year%400 ==0)){
            System.out.println("是闰年:"+year);
        }else{
            System.out.println("是平年:"+year);
        }
    }
}
import java.util.Scanner;
public class Demo {
    //控制台输入性别
    public  static  void  main(String[]  args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入您的性别");
        char gender = input.next().charAt(0);
        if (gender=='男'){
            System.out.println("送一只手表");
        }else if(gender=='女'){
            System.out.println("送一只口红");
        }else
            System.out.println("程序结束");
    }
} 
3.2.3 多重if分支

语法:

if(逻辑条件1){

满足逻辑条件1执行的代码

}else if(逻辑条件2){ //隐藏条件(不满足条件1)

满足逻辑条件2执行的代码

}else if(逻辑条件3){ //隐藏条件(不满足条件1、2)

满足逻辑条件3执行的代码

}else{

不满足以上所有逻辑条件执行的代码

}

格式:if (关系表达式1) { //判断条件1
    语句体1;
} else if (关系表达式2) { //判断条件2
    语句体2;
}
…else {
    语句体n+1;
}
*特别注意:**最后的else可以省略不写【通过所有else if语句将条件都提供了】,else如果要书写必须出现在最后的 位置代表着最后的一种情况,之前所有提供判断条件都为false就执行对应else操作【推荐书写else形式,可以省略最后一个else if语句判断条件操作】*
*只要在if-else if语句中提供的某个关系表达式判断结果为true,后续代码中提供判断条件皆不在执行*

需求:输入一个字符,判断该字符类型(数字,小写,大写,其他)

//需求:输入一个字符,判断该字符类型(数字,小写,大写,其他)
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个字符:");
        // 在Java中Scanner是不可以着获取到一个字符的即没有nextChar方法
        // 需要通过next方法在通过charAt方法获取到字符
        char ch = input.next().charAt(0);
        if (ch >= '0' && ch<='9'){
            System.out.println("是数字:"+ch);
        }else if(ch >= 'A' && ch <= 'Z'){
            System.out.println("是大写字母:"+ch);
        }else if(ch >= 'a' && ch <= 'z'){
            System.out.println("是小写字母:"+ch);
        }else{
            System.out.println("其他字符:"+ch);
        }
    }
}
3.2.4 嵌套if分支

语法:

if(逻辑条件1){

if(逻辑条件2){

满足逻辑条件1且满足条件2执行的代码

}else{

满足逻辑条件1但不满足条件2执行的代码

} // 内层代码块

}else{

不满足逻辑条件1执行的代码

}

  • 执行流程:
  • 当外层条件满足时,再判断内层条件
  • 注意:
  • 一个选择结构中,可嵌套另一个选择结构
  • 嵌套格式正确的情况下,支持任意组合。

需求:学校举行跑步比赛,如果成绩在15秒以内,可以进入决赛,男的进入男子组决赛,女的进入女子组决赛

//学校举行跑步比赛,如果成绩在15秒以内,可以进入决赛,男的进入男子组决赛,女的进入女子组决赛
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的比赛成绩");
        double score = sc.nextDouble();
        if(score < 15){
            System.out.println("请输入你的性别");
            String sex = sc.next(); if(sex.equals("男")){
                System.out.println("恭喜进入男子组");
            }else{
                System.out.println("恭喜进入女子组");
            }
        }else{
            System.out.println("很遗憾你被淘汰了!!!");
        }
    }
}     

需求:小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入小明的考试成绩:");
        int score = input.nextInt();
        //1.提供第一个判断,判断成绩是否合法【成绩是否在0~100之间】
        if(score >= 0 && score <= 100){//证明成绩合法
        //2.提供第二个判断 ,判断成绩范围得到奖励
            if(score>=95){    //if(score>=95 && score<=100){
                System.out.println("奖励一套别墅");
            }else if(score>=85){   //else if(score>=85 && score<=94){
                System.out.println("奖励1w元RMB");
            }else{
                System.out.println("小黑屋单独聊天.....");
            }
        }else{//证明成绩不合法
            System.out.println("输入考试成绩不合法!!!");
        }
    }
}
3.2.5 if分支语句细节

注意1:

在java中 == 比较的是内存地址

String类的equals比较的是内容 .equals()

基本数据类型使用==比较

String类型使用equals比较

注意2:

在if分支中,大括号可以省略不写,但是如果不写大括号,那么这个if分支只能控制一行代码

如果if或else中只有一条语句,可以省略{ }

注意3:

多重if中要将苛刻条件写前面

3.3 switch 分支
3.3.1 switch分支使用

选择分支结构:

switch中的值:byte short int char String 枚举类型

switch(值){

case 值1:

switch中的值与值1相等时候执行的代码


break;


case 值2:


switch中的值与值2相等时候执行的代码


break;


case 值3:


switch中的值与值3相等时候执行的代码


break;


case 值4:


switch中的值与值4相等时候执行的代码

 break;

default:

switch中的值与以上所有值都不相等时候执行的代码

break;

}

switch (表达式) {
    case 1:
        语句体1;
        break;
    case 2:
        语句体2;
        break;
    ...
    default:
        语句体n+1;
        break;
}
*特别说明:*
*在使用switch这个分支语句提供判断条件时,需要注意判断条件即表达式只能是【整数(long除外)、字
符、字符串和枚举】四种类型之一,剩余类型switch均不支持,偶尔可以使用算数运算符组成表达式进行计
算* *特别强调,不允许使用boolean类型*
*case 后面提匹配条件,需要与表达式提供数据类型一直,并且是在提供数据类范围内的数据*

需求:要求选择A和a是一样的结果

import java.util.Scanner;
//要求选择A和a是一样的结果
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的选择");
        String option = sc.next();
        switch (option){
            case "a":
            case "A":
                System.out.println("好评");
                break;
            case "b":
            case "B":
                System.out.println("一般");
                break;
            case "c":
            case "C":
                System.out.println("良好");
                break;
            case "d":
            case "D":
                System.out.println("差评");
                break;
        }
    }
}
3.3.2 switch分支细节
  1. 适合做等值判断 —在switch中值的类型:byte、short、int、char、String(JDK7+))、枚举
  2. 在switch中case值不允许重复
  3. 在switch中break表示结束当前switch语句
  • break可以省略不写
  • 如果省略break,执行完代码块后,不能退出switch,如果省略会出现case穿透(switch会一直往下执行,直到遇到下一个break)
  1. switch和多重if的区别:
  • 多重if中可以做关系运算,在swtich中只能做等值判断

6.default可以放在任何位置,也可以省略

实现一个简易计算器

//实现一个简易计算器
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int n1 = sc.nextInt();
        System.out.println("请输入第二个数字");
        int n2 = sc.nextInt();
        System.out.println("请输入运算符");
        char ope = sc.next().charAt(0);
        //保存结果*
        int result =0;
        switch (ope){
            case '+':
                result = n1+n2;
                break;
            case '-':
                result = n1-n2;
                break;
            case '*':
                result = n1*n2;
                break;
            case '/':
                if (n2==0){
                    System.out.println("除数不能为0");
                }else {
                    result = n1 / n2;
                }
                break;
            case '%':
                result = n1%n2;
                break;
            default:
                System.out.println("不支持此运算");
                break;
        }
        System.out.println("结果是"+result);
    }
}


import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个季节");
        char season = sc.next().charAt(0);
        //String season = sc.next();  则双引号包裹内容"春"
        switch (season){
            case '春':
                System.out.println("春暖花开");
                break;
            case '夏':
                System.out.println("夏日炎炎");
                break;
            case '秋':
                System.out.println("秋高气爽");
                break;
            case '冬':
                System.out.println("白雪皑皑");
                break;
            default:
                System.out.println("输入有误");
                break;
        }
    }
}

3.3.4 break语句case穿透的使用

switch语句中case语句内使用break关键字作为结束switch语句操作,但是Java中是允许case语句不写break关键字,如果不提供break关键字,此时switch语句中提供case操作就会贯穿【穿透】效果,穿透的效果是不会匹配后续case中提供条件【就算匹配不成功执行】,直到再次遇到break关键字时停止或者执行到代码末尾停止。


需求:在不考虑平闰年的前提下,通过控制台输入1-12月之间任意一个月份,输出对应的天数


如果不适用switch语句穿透效果,那么需要提供12个case进行数据匹配,但是在12个case中有多个case执行效果都是一样的


2 月份 28天 4,6,9,11 月份30天 1,3,5,7,8,10,12 月份 31天


利用case穿透特性节约代码,解决不同case条件但是执行语句操作相同的方式

import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入(1~12)之间数字代表月份:");
        int month = input.nextInt();
        switch (month){
            case 2:
                System.out.println("28天");
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                System.out.println("30天");
                break;
            default:
                System.out.println("31天");
                break;
        }
    }
}
import java.util.Scanner;
public class Demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个月份");
        int month = sc.nextInt();
        //1 3 5 7 8 10 12 31天
        //2
        //4 6 9 11 30天
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                System.out.println("31天");
                break;
            case 2:
                System.out.println("28天");
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                System.out.println("30天");
                break;
            default:
                System.out.println("输入有误");
                break;
        }
    }
}
3.4 总结switch和if分支的区别
  1. 相同点: 都是分支语句,都是可以互相嵌套的
  2. 不同点: switch语法和if语法是不同,switch语句和if语句提供判断条件不同,

f语句使用boolean类型【关系和逻辑运算符组成表达式】,if使用场景多用于范围内数据值

switch语句使用整数【不包括long】、字符、枚举和字符串类型【更加倾向于具体的数值】,switch使用场景多用于某个固定数值

  1. 值】,switch使用场景多用于某个固定数值

PS:实际开发中还是使用if分支语句较多

变量类型(补充)

局部变量优先级高于成员变量

  1. 局部变量

概念:声明在方法内部的变量,必须先赋值再使用。

作用范围:定义行开始到所在的代码块【即花括号内】结束。

注意:多个变量,在重合的作用范围内,不能出现重名。

  1. 成员变量(静态的和非静态的)

概念:声明在方法外部,类内部的变量,有默认值(可以不赋值)。

作用范围:整个类内部使用。

注意:如果和局部变量同名,局部变量优先级高。

如果成员变量不赋值,则:
byte int short long默认为0;
double float默认为0.0;
true false默认false
char 默认空字符“ ”
public class Demo {
    public static void main(String[] args) {
        //局部变量  必须先赋值才能使用
        int age = 20;
        System.out.println(age);//20
        if (age>=18){
            int num = 100;
            System.out.println(age); //20
            System.out.println(num); //100
            if (num>20){
                System.out.println(++num); //101
                System.out.println("--------");
            }
        }
        System.out.println(age); //20
        int num = 200;
        //int age = 30;  Variable 'age' is already defined in the scope
        System.out.println(num);  //200
    }
}

成员变量

public class Demo {
    //类内部,方法外部
    
    static char money;
    public static void main(String[] args) {
        //局部变量  必须先赋值才能使用
        int age = 20;
        System.out.println(age);//20
        System.out.println(money);//static char money=77,输出77
        // 不赋值byte int short long默认为0;
        // double float默认为0.0;
        // true false默认false
        // char 默认空字符“ ”
    }

    //类内部,方法外部
}      
目录
相关文章
|
2月前
|
存储 缓存 安全
除了变量,final还能修饰哪些Java元素
在Java中,final关键字不仅可以修饰变量,还可以用于修饰类、方法和参数。修饰类时,该类不能被继承;修饰方法时,方法不能被重写;修饰参数时,参数在方法体内不能被修改。
33 2
|
2月前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
57 12
|
2月前
|
Java 编译器
Java重复定义变量详解
这段对话讨论了Java中变量作用域和重复定义的问题。学生提问为何不能重复定义变量导致编译错误,老师通过多个示例解释了编译器如何区分不同作用域内的变量,包括局部变量、成员变量和静态变量,并说明了使用`this`关键字和类名来区分变量的方法。最终,学生理解了编译器在逻辑层面检查变量定义的问题。
Java重复定义变量详解
|
2月前
|
Java
java switch case多个条件
通过本文的介绍,我们详细探讨了Java中 `switch case`语句的多种用法和优化方法。从基本语法到合并多个条件,再到使用枚举、常量和函数优化,`switch case`语句在Java编程中提供了一种灵活且高效的控制流方式。掌握这些技巧,能够编写出更加简洁、可读性强的代码,提高开发效率和代码质量。希望本文能为您在实际开发中提供有价值的参考和指导。
115 2
|
2月前
|
Java 程序员 容器
Java中的变量和常量:数据的‘小盒子’和‘铁盒子’有啥不一样?
在Java中,变量是一个可以随时改变的数据容器,类似于一个可以反复打开的小盒子。定义变量时需指定数据类型和名称。例如:`int age = 25;` 表示定义一个整数类型的变量 `age`,初始值为25。 常量则是不可改变的数据容器,类似于一个锁死的铁盒子,定义时使用 `final` 关键字。例如:`final int MAX_SPEED = 120;` 表示定义一个名为 `MAX_SPEED` 的常量,值为120,且不能修改。 变量和常量的主要区别在于变量的数据可以随时修改,而常量的数据一旦确定就不能改变。常量主要用于防止意外修改、提高代码可读性和便于维护。
|
2月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
84 2
|
2月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List&lt;String&gt;` 和 `List&lt;Integer&gt;` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList&lt;Integer&gt;` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
50 2
|
2月前
|
小程序 前端开发 算法
JAVA基础——三种流程控制语句
JAVA基础——三种流程控制语句
304 0
JAVA基础——三种流程控制语句