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 默认空字符“ ”
    }

    //类内部,方法外部
}      
目录
相关文章
|
3月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
122 7
|
4月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
5月前
|
安全 算法 Java
Java泛型编程:类型安全与擦除机制
Java泛型详解:从基础语法到类型擦除机制,深入解析通配符与PECS原则,探讨运行时类型获取技巧及最佳实践,助你掌握泛型精髓,写出更安全、灵活的代码。
|
5月前
|
安全 IDE Java
Java记录类型(Record):简化数据载体类
Java记录类型(Record):简化数据载体类
465 143
|
5月前
|
安全 Java
Java中的Switch表达式:更简洁的多路分支
Java中的Switch表达式:更简洁的多路分支
522 211
|
5月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
1602 1
|
5月前
|
Java 测试技术
Java浮点类型详解:使用与区别
Java中的浮点类型主要包括float和double,它们在内存占用、精度范围和使用场景上有显著差异。float占用4字节,提供约6-7位有效数字;double占用8字节,提供约15-16位有效数字。float适合内存敏感或精度要求不高的场景,而double精度更高,是Java默认的浮点类型,推荐在大多数情况下使用。两者都存在精度限制,不能用于需要精确计算的金融领域。比较浮点数时应使用误差范围或BigDecimal类。科学计算和工程计算通常使用double,而金融计算应使用BigDecimal。
2215 102
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
227 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
243 1
|
4月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案