日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

入门篇-其之九-流程控制之条件判断

發(fā)布時(shí)間:2023/11/25 windows 29 coder
生活随笔 收集整理的這篇文章主要介紹了 入门篇-其之九-流程控制之条件判断 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文中使用到的工具是Intellij IDEA和JDK 8,需要安裝兩款工具的請查看這兩篇教程:點(diǎn)我查看安裝JDK8/11/17教程、點(diǎn)我查看安裝Intellij IDEA教程。

前面我們寫過的代碼,都是在main方法中自上到下按順序執(zhí)行的,舉一個(gè)代碼栗子:

/**
 * 計(jì)算西瓜的價(jià)格
 *
 * @author iCode504
 * @date 2023-10-31
 */
public class MyWatermelonDemo1 {
    public static void main(String[] args) {
        int price = 2;      // 西瓜的單價(jià)
        int weight = 10;    // 西瓜的重量(公斤)
        int totalPrice = price * weight;    // 購買價(jià)格
        System.out.println("西瓜的價(jià)格是: " + totalPrice + "元");
    }
}

這段代碼就是先定義西瓜的單價(jià)、再定義西瓜的重量,然后計(jì)算西瓜的價(jià)格,最后對價(jià)格進(jìn)行輸出。像這樣代碼從上到下執(zhí)行的結(jié)構(gòu)就是順序結(jié)構(gòu)

程序一共有三種控制結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。其中選擇結(jié)構(gòu)是根據(jù)條件判定的結(jié)果,選擇執(zhí)行不同的代碼,例如:紅燈停,綠燈行。判斷條件就是交通信號(hào)燈的狀態(tài)。

Java也有選擇結(jié)構(gòu),并且有多種類型的條件判斷語句:單分支的if語句、雙分支的if-else語句、多分支的if-else if-else語句、if嵌套語句和switch語句。

一、單分支if語句

單分支if語句的語法如下:

if (條件表達(dá)式) {
    執(zhí)行代碼...
}

其中條件表達(dá)式的計(jì)算結(jié)果必須是boolean類型。如果條件表達(dá)式的計(jì)算結(jié)果是true,那么就會(huì)執(zhí)行if內(nèi)部的代碼;如果表達(dá)式為false,此時(shí)就會(huì)跳過if代碼塊(也就是if內(nèi)部代碼不執(zhí)行),概念圖如下:

我們可以在if代碼塊中可以編寫多個(gè)執(zhí)行語句。

以下是if的使用案例:

案例:之前長春下了大暴雪,氣溫驟降,我想在某寶上買幾雙棉襪子,假設(shè)每雙襪子4元,請確保輸入的數(shù)字大于0再計(jì)算購買價(jià)格。

分析:解題的關(guān)鍵在于要保證輸入的數(shù)字要大于0,因此要判斷輸入的數(shù)字是否大于0,示例代碼如下:

import java.util.Scanner;

/**
 * if條件判斷
 *
 * @author iCode504
 * @date 2023-11-07
 */
public class IfDemo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入襪子的數(shù)量");
        int count = scanner.nextInt();
        double totalPrice = 0.0;    // 默認(rèn)總價(jià)格初始值為0.0
        double price = 4;       // 襪子的價(jià)格4元
        // 條件判斷: 輸入的數(shù)量是否大于0
        if (count > 0) {
            totalPrice = count * price;
            System.out.println("購買了" + count + "雙襪子, 價(jià)格是" + totalPrice + "元");
        }
    }
}

運(yùn)行結(jié)果:

案例:輸入一個(gè)數(shù)字,如果能被10整除,則輸出內(nèi)容為:xx能被10整除。如果能被15整除,則輸出內(nèi)容為:xx能被15整除。

解決本題的關(guān)鍵點(diǎn)在于被10整除和被15整除的條件怎么計(jì)算。其實(shí)前面我們學(xué)過取余運(yùn)算符,如果數(shù)值number能被10整除,那么可以寫成number % 10 == 0;如果數(shù)值number能被15整除,那么可以寫成number % 15 == 0。這兩個(gè)布爾表達(dá)式可以寫入到兩個(gè)if語句中:

import java.util.Scanner;

/**
 * 使用if語句判斷數(shù)字能否被10和15整除
 *
 * @author iCode504
 * @date 2023-11-07
 */
public class IfDemo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入數(shù)字: ");
        int number = scanner.nextInt();

        // 整除10的條件:數(shù)字對10取余等于0
        if (number % 10 == 0) {
            System.out.println(number + "能被10整除");
        }

        // 整除15的條件:數(shù)字對15取余等于0
        if (number % 15 == 0) {
            System.out.println(number + "能被15整除");
        }
    }
}

輸入不同的數(shù)字以后,會(huì)得到如下的運(yùn)行結(jié)果:

案例:輸入兩個(gè)整數(shù),如果輸入的第一個(gè)數(shù)字比第二個(gè)數(shù)字大,那么執(zhí)行兩數(shù)交換,并將交換結(jié)果輸出。否則不交換,正常輸出兩個(gè)數(shù)

本題的條件表達(dá)式是輸入的兩個(gè)數(shù)字的比較,無論數(shù)字大小比較結(jié)果如何,都需要將結(jié)果進(jìn)行輸出,我們可以將輸出語句放到if語句后面執(zhí)行。

兩數(shù)交換有多種方式,較為穩(wěn)妥的方式是再定義一個(gè)臨時(shí)變量,用這個(gè)臨時(shí)變量來接收第一個(gè)變量值,然后第二個(gè)變量值賦值給第一個(gè)變量,最后將臨時(shí)變量的值賦值給第二個(gè)變量。

以下是示例代碼:

import java.util.Scanner;

/**
 * 單分支if語句實(shí)現(xiàn)兩數(shù)交換
 *
 * @author iCode504
 * @date 2023-11-11
 */
public class IfDemo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入兩個(gè)整數(shù)");
        int number1 = scanner.nextInt();
        int number2 = scanner.nextInt();
        int temp = 0;       // 定義臨時(shí)變量
        if (number1 > number2) {    // 實(shí)現(xiàn)兩數(shù)交換功能
            temp = number1;
            number1 = number2;
            number2 = temp;
        }
        System.out.println("第一個(gè)數(shù)是: " + number1 + ", 第二個(gè)數(shù)是: " + number2);
    }
}

運(yùn)行結(jié)果:

當(dāng)然,除了上述方式能實(shí)現(xiàn)兩數(shù)交換,還有其他的方式。

方式一:使用加減法進(jìn)行交換(推薦使用整數(shù),浮點(diǎn)數(shù)不推薦,因?yàn)楦↑c(diǎn)數(shù)計(jì)算時(shí)會(huì)出現(xiàn)誤差)

int number1 = 3;
int number2 = 2;
number1 = number1 + number2;	// number1 = 3 + 2 = 5
number2 = number1 - number2;	// number2 = 5 - 2 = 3
number1 = number1 - number2;	// number1 = 5 - 3 = 2

方式二:使用位運(yùn)算符進(jìn)行交換(推薦使用整數(shù),此處涉及到二進(jìn)制異或運(yùn)算,異或運(yùn)算可以查看這篇文章:入門篇-其之六-Java運(yùn)算符(中)第四部分-位運(yùn)算符)

int number1 = 3;
int number2 = 2;
number1 = number1 ^ number2;        // 3 ^ 2 = 1
number2 = number1 ^ number2;        // 3 ^ 1 = 2
number1 = number1 ^ number2;        // 1 ^ 2 = 3

當(dāng)然,上述三種方式我個(gè)人最推薦的還是第一種定義臨時(shí)變量的方式,這種方式對處理浮點(diǎn)類型的數(shù)進(jìn)行交換很友好,如果使用了下面兩種方式的話,可能會(huì)在計(jì)算過程中出現(xiàn)精度損失的問題。后兩種方式的好處是不需要定義第三個(gè)變量,只需要進(jìn)行一系列運(yùn)算即可完成整數(shù)值的交換。

二、if-else雙分支語句

前面講過的單分支if語句只有在布爾表達(dá)式為true的時(shí)候執(zhí)行其內(nèi)部的內(nèi)容,但是如果在布爾表達(dá)式為false的時(shí)候不會(huì)做任何事情。為了解決上述問題,Java為我們提供了if-else雙分支語句。以下是雙分支if-else語句代碼結(jié)構(gòu):

if (條件表達(dá)式) {
    執(zhí)行代碼1...
} else {
    執(zhí)行代碼2...
}

如果條件表達(dá)式的值是true,那么就執(zhí)行if內(nèi)部的語句,如果條件表達(dá)式為false,此時(shí)就進(jìn)入else代碼塊。執(zhí)行流程圖如下:

案例:我們還是以上述買襪子為例,最近雙十一打折,如果買了10雙及以上襪子,此時(shí)每雙襪子打八折優(yōu)惠,否則打九折優(yōu)惠(襪子的價(jià)格假設(shè)是4元/雙)。

題目中的條件表達(dá)式在于要買的襪子數(shù)量是否大于等于10,如果是,價(jià)格打8折,否則打9折,使用剛剛講到的if-else語句即可搞定。

當(dāng)然,這道題中還有一個(gè)隱藏的細(xì)節(jié)需要我們處理:輸入襪子的數(shù)量需要大于0,否則判定為無效,這個(gè)可以使用單分支if語句就可以搞定。

以下是示例代碼:

import java.util.Scanner;

/**
 * if-else雙分支語句
 *
 * @author iCode504
 * @date 2023-11-11
 */
public class IfDemo4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入要購買的襪子數(shù)量");
        int count = scanner.nextInt();
        double price = 4;       // 每雙襪子的價(jià)格
        double totalPrice = 0.0;    // 默認(rèn)總價(jià)格為0.0
        // 需要保證輸入的襪子數(shù)量要大于0
        if (count > 0) {
            // 如果襪子的數(shù)量大于10,此時(shí)每雙襪子的價(jià)格為8折,即每雙襪子的價(jià)格乘以0.8,九折的計(jì)算方式和上述內(nèi)容同理
            if (count >= 10) {
                totalPrice = price * 0.8 * count;
            } else {
                totalPrice = price * 0.9 * count;
            }
        }
        System.out.println("購買" + count + "雙襪子,雙十一期間購買價(jià)格是" + totalPrice + "元");
    }
}

運(yùn)行結(jié)果(可能會(huì)出現(xiàn)浮點(diǎn)數(shù)計(jì)算不準(zhǔn)確的情況,屬于正常現(xiàn)象):

三、if-else if-else多分支語句

雙分支的if-else語句對于條件表達(dá)式為truefalse的時(shí)候比較適用,但是如果對于一個(gè)問題而言,此時(shí)經(jīng)過分析可能存在多個(gè)條件表達(dá)式時(shí),if-else語句并不能很好地完成任務(wù),此時(shí)Java為我們提供了另一種分支語句:if-else if-else語句,其語法格式如下:

if (條件表達(dá)式1) {
	執(zhí)行代碼1...
} else if (條件表達(dá)式2) {
	執(zhí)行代碼2...
} else if (條件表達(dá)式3) {
	執(zhí)行代碼3...
} ...
  else if (條件表達(dá)式n) {
	執(zhí)行代碼n...      
} else {
  	不符合上述所有條件表達(dá)式時(shí)執(zhí)行else代碼...
}

以上述語法格式為例,其執(zhí)行順序?yàn)椋?/p>

  • 如果條件表達(dá)式1的結(jié)果為true,那么執(zhí)行代碼1,如果結(jié)果是false,此時(shí)就會(huì)跳轉(zhuǎn)到第一個(gè)else if。
  • 如果條件表達(dá)式2的結(jié)果是true,那么執(zhí)行代碼2,如果結(jié)果是false,那么就會(huì)跳轉(zhuǎn)到第二個(gè)else if
  • 如果條件表達(dá)式3的結(jié)果是true,那么執(zhí)行代碼3,如果結(jié)果是false,那么就會(huì)跳轉(zhuǎn)到下一個(gè)else if,依次類推。
  • 當(dāng)上述所有的條件表達(dá)式都不滿足(即結(jié)果全部是false)時(shí),就會(huì)執(zhí)行else中的語句。

多分支的if-else if-else語句中,你可以寫任意個(gè)else if,每個(gè)else if需要寫上條件表達(dá)式。

當(dāng)然,最后的else也是可選的,ifelse-if搭配使用也是可以的。以下是執(zhí)行流程圖:

案例:已知長春的地鐵/輕軌票價(jià)標(biāo)準(zhǔn)如下

  • 0-7公里(含7公里),票價(jià)2元;
  • 7-13公里(含13公里),票價(jià)3元;
  • 13-19公里(含19公里),票價(jià)4元;
  • 19-27公里(含27公里),票價(jià)5元;
  • 27-35公里(含35公里),票價(jià)6元;
  • 35公里以上每增加10公里,增加1元

假設(shè)從1號(hào)線紅嘴子地鐵站到8號(hào)線廣通路輕軌站的距離是31.4公里,從2號(hào)線汽車公園地鐵站到2號(hào)線東方廣場地鐵站的距離是20.5公里,從4號(hào)線長春站北輕軌站到4號(hào)線天工路輕軌站的距離是16.3公里。

輸入上述里程,利用程序計(jì)算出乘坐軌道交通所需要的票價(jià)。

上述題目中出現(xiàn)了多個(gè)條件判斷,每個(gè)條件判斷執(zhí)行內(nèi)容都不相同,使用多分支語句if-else if-else語句比較合適。題目中有一個(gè)隱藏條件,輸入里程數(shù)不能為負(fù)數(shù),當(dāng)然這個(gè)條件也直接寫入條件判斷即可。

如果乘坐軌道交通的里程超過35公里以后,每增加10公里,增加1元。例如:乘坐45公里就要在35公里對應(yīng)的票價(jià)6元的基礎(chǔ)上再增加1元,當(dāng)然,55公里、65公里依次類推。假設(shè)稱作里程為44.9公里,此時(shí)收費(fèi)標(biāo)準(zhǔn)仍為35公里的票價(jià)。

針對上述問題,我們可以在代碼中進(jìn)一步呈現(xiàn):

import java.util.Scanner;

/**
 * if-else if-else多分支語句的使用
 *
 * @author iCode504
 * @date 2023-11-14
 */
public class ElseIfDemo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入里程數(shù): ");
        // 里程數(shù)使用double類型比較合適,因?yàn)轭}目中涉及到距離的使用到了小數(shù)
        double distance = scanner.nextDouble();
        int price = 0;
        if (distance <= 0) {
            System.out.println("無效里程");
        } else if (distance > 0 && distance <= 7) {
            price = 2;
        } else if (distance > 7 && distance <= 13) {
            price = 3;
        } else if (distance > 13 && distance <= 19) {
            price = 4;
        } else if (distance > 19 && distance <= 27) {
            price = 5;
        } else if (distance > 27 && distance <= 35) {
            price = 6;
        } else {
            // 超過35公里的需要額外進(jìn)行處理
            price = 6;      // 35公里對應(yīng)的票價(jià)
            // 計(jì)算多余的里程
            // 這里需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的目的有兩個(gè):
            // 1. 最后計(jì)算票價(jià)的price是int類型
            // 2. 針對類似在35~45公里之間的里程后續(xù)的票價(jià)計(jì)算處理
            int additionalDistance = (int) (distance - 35);
            // 計(jì)算票價(jià)
            price = price + additionalDistance / 10;
        }
        System.out.println("乘坐長春軌道交通里程" + distance + "公里,票價(jià)" + price + "元");
    }
}

運(yùn)行結(jié)果如下:

四、if的嵌套使用

正如標(biāo)題所講,if語句可以嵌套使用。舉個(gè)栗子:在main方法中,假設(shè)已經(jīng)存在了一個(gè)if-else語句,那么在這個(gè)if代碼塊或者else代碼塊還可以存在條件判斷語句,下面就是其中一種if的嵌套使用方式(事實(shí)上它可以if代碼塊可以進(jìn)行多種組合嵌套使用):

if (條件表達(dá)式1) {
    if (條件表達(dá)式2) {
        執(zhí)行代碼1...
    } else {
    	執(zhí)行代碼2...
    }
} else {
    if (條件表達(dá)式3) {
    	執(zhí)行代碼3...
    } else {
    	執(zhí)行代碼4...
    }
}

它的執(zhí)行流程如下:

  • 如果條件表達(dá)式1的執(zhí)行結(jié)果是true,進(jìn)入條件表達(dá)式2,如果條件表達(dá)式2執(zhí)行結(jié)果是true,此時(shí)執(zhí)行代碼1。
  • 如果條件表達(dá)式1的執(zhí)行結(jié)果是true,進(jìn)入條件表達(dá)式2,如果條件表達(dá)式2執(zhí)行結(jié)果是false,此時(shí)執(zhí)行代碼2。
  • 如果條件表達(dá)式1的執(zhí)行結(jié)果是false,進(jìn)入條件表達(dá)式3,如果條件表達(dá)式3執(zhí)行結(jié)果是true,此時(shí)執(zhí)行代碼3。
  • 如果條件表達(dá)式1的執(zhí)行結(jié)果是false,進(jìn)入條件表達(dá)式3,如果條件表達(dá)式3執(zhí)行結(jié)果是false,此時(shí)執(zhí)行代碼4。

執(zhí)行流程圖如下所示:

日常寫代碼的過程中,盡量保證代碼嵌套的層數(shù)不超過兩層。

案例:輸入三個(gè)數(shù),要求輸出是按照從大到小進(jìn)行排列。例如,輸入三個(gè)數(shù)為20、30、10,輸出結(jié)果為30、20、10

  • 第一層條件:比較第一個(gè)數(shù)和第二個(gè)數(shù)。
  • 第二層條件:比較第二個(gè)數(shù)和第三個(gè)數(shù)。
  • 第三層條件:比較第一個(gè)數(shù)和第三個(gè)數(shù)。
import java.util.Scanner;

/**
 * if的嵌套--三個(gè)數(shù)字排列
 *
 * @author iCode504
 * @date 2023-11-23
 */
public class IfDemo5 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入三個(gè)整數(shù): ");
        int number1 = scanner.nextInt();
        int number2 = scanner.nextInt();
        int number3 = scanner.nextInt();
        if (number1 > number2) {
            if (number2 > number3) {
                System.out.println("三個(gè)數(shù)從大到小的排序是: " + number1 + " " + number2 + " " + number3);
            } else {
                if (number1 > number3) {
                    System.out.println("三個(gè)數(shù)從大到小的排序是: " + number1 + " " + number3 + " " + number2);
                } else {
                    System.out.println("三個(gè)數(shù)從大到小的排序是: " + number3 + " " + number1 + " " + number2);
                }
            }
        } else {
            if (number2 < number3) {
                System.out.println("三個(gè)數(shù)從大到小的排序是: " + number3 + " " + number2 + " " + number1);
            } else {
                if (number1 > number3) {
                    System.out.println("三個(gè)數(shù)從大到小的排序是: " + number2 + " " + number3 + " " + number1);
                } else {
                    System.out.println("三個(gè)數(shù)從大到小的排序是: " + number2 + " " + number1 + " " + number3);
                }
            }
        }
    }
}

運(yùn)行結(jié)果:

雖然運(yùn)行結(jié)果符合我們的預(yù)期,但是我只能說:這樣的代碼寫的非常糟糕!?。∵@段代碼中if的嵌套層數(shù)達(dá)到了三層,事實(shí)上if嵌套兩層以上可讀性就大打折扣了。

我們可以使用Java數(shù)組、循環(huán)和數(shù)組方法對此問題做進(jìn)一步處理(小白可以跳過這一部分)。

import java.util.Arrays;
import java.util.Scanner;

/**
 * 三數(shù)比較--按照從大到小的順序排列
 *
 * @author iCode504
 * @date 2023-11-23
 */
public class IfDemo6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入三個(gè)數(shù)字: ");
        Integer[] array = new Integer[3];
        for (int i = 0; i < array.length; i++) {
            array[i] = scanner.nextInt();
        }
        // 調(diào)用Arrays.sort方法對數(shù)組排序,排序規(guī)則從大到小(lambda表達(dá)式)
        Arrays.sort(array, (o1, o2) -> o2 - o1);
        System.out.println("三個(gè)數(shù)從大到小的排序是: " + array[0] + " " + array[1] + " " + array[2]);
    }
}

運(yùn)行結(jié)果:

五、switch語句

if-else if-else多分支語句可以用于多個(gè)條件表達(dá)式的判斷,我們可以寫非常多的else if,然而過多的else if可能會(huì)導(dǎo)致代碼的可讀性變差。

Java為我們提供了swtich語句在一定程度上可以簡化多條件分支。以下是switch的語法結(jié)構(gòu):

switch (表達(dá)式) {
    case 值1:
        執(zhí)行代碼1...
        break;
    case 值2:
        執(zhí)行代碼2...
        // break
    case 值3:
        執(zhí)行代碼3...
        break;
    ...
    case 值n:
        執(zhí)行代碼n...
        break;
    default: 
        上述條件都不適用執(zhí)行代碼...
}

1. switch語句中表達(dá)式的計(jì)算結(jié)果、值1、值2、...、值n的數(shù)據(jù)類型必須要保持一致。支持的數(shù)據(jù)類型包括:byte、short、int、char、字符串類型String(JDK 7新特性)、枚舉類型(后續(xù)會(huì)講到,JDK 7新特性)。

2. 如果表達(dá)式的計(jì)算結(jié)果和case中某個(gè)值相等時(shí),就會(huì)執(zhí)行這個(gè)case內(nèi)的代碼。

3. switch語句中的default是可選的,它的作用是當(dāng)表達(dá)式的計(jì)算結(jié)果和所有case的值都不相等時(shí)才會(huì)執(zhí)行default語句,如果default語句不存在時(shí),所有的case對應(yīng)的值和判定值都不相等時(shí),跳出switch語句。

4. break的作用是跳出switch語句break關(guān)鍵字還會(huì)在循環(huán)中遇到),在每一個(gè)case對應(yīng)的代碼塊后面寫上break是個(gè)好習(xí)慣。

如果case中不加break,此時(shí)switch語句會(huì)出現(xiàn)穿透性,即當(dāng)某一個(gè)case執(zhí)行完成后,它會(huì)繼續(xù)執(zhí)行下面其他的case。以下是一個(gè)是否使用break的案例:

案例:輸入數(shù)字1~7,使用switch語句輸出當(dāng)前日期(假設(shè)7代表星期日)

import java.util.Scanner;

/**
 * switch語句--不加break--穿透性
 *
 * @author iCode504
 * @date 2023-11-15
 */
public class SwitchDemo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入星期數(shù)(1~7), 7表示星期日");
        int number = scanner.nextInt();
        switch (number) {
            case 1:
                String monday = "星期一";
                System.out.println("今天是" + monday);
            case 2:
                String tuesday = "星期二";
                System.out.println("今天是" + tuesday);
            case 3:
                String wednesday = "星期三";
                System.out.println("今天是" + wednesday);
            case 4:
                String thursday = "星期四";
                System.out.println("今天是" + thursday);
            case 5:
                String friday = "星期五";
                System.out.println("今天是" + friday);
            case 6:
                String saturday = "星期六";
                System.out.println("今天是" + saturday);
            case 7:
                String sunday = "星期日";
                System.out.println("今天是" + sunday);
            default:
                System.out.println("無效日期");
        }
    }
}

運(yùn)行結(jié)果:

很明顯,輸入數(shù)字3的時(shí)候,由于沒有break,當(dāng)執(zhí)行case 3內(nèi)部代碼以后,它會(huì)向下執(zhí)行其他case中的代碼,直至default內(nèi)的代碼執(zhí)行完畢為止。并且這段代碼還有可以進(jìn)一步修改的空間,以下是加入break并進(jìn)行簡化的代碼:

import java.util.Scanner;

/**
 * switch語句--添加break--穿透性
 *
 * @author iCode504
 * @date 2023-11-15
 */
public class SwitchDemo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入星期數(shù)(1~7), 7表示星期日");
        int number = scanner.nextInt();
        String weekday;
        switch (number) {
            case 1:
                weekday = "星期一";
                break;
            case 2:
                weekday = "星期二";
                break;
            case 3:
                weekday = "星期三";
                break;
            case 4:
                weekday = "星期四";
                break;
            case 5:
                weekday = "星期五";
                break;
            case 6:
                weekday = "星期六";
                break;
            case 7:
                weekday = "星期日";
                break;
            default:
                weekday = "無效星期";
        }
        System.out.println("今天是" + weekday);
    }
}

運(yùn)行結(jié)果:

從上述結(jié)果可以看出,使用break以后,就可以阻斷switch穿透性。

switch語句執(zhí)行流程如下圖所示(每個(gè)case都帶上break語句):

在了解了switch語句的基礎(chǔ)上,我們再來講解一個(gè)switch語句和if-else語句結(jié)合使用的案例:

案例:輸入年份和月份,輸出格式如下:xxxx年xx月有xx天。

常識(shí):1、3、5、7、8、10、12恒定是31天;4、6、9、11恒定為30天。這幾個(gè)月份我們可以利用switch的穿透性替換掉多條件的else if判斷。

需要額外考慮的是:2月份的天數(shù)需要考慮年份是閏年還是平年,閏年能被400整除,例如:2000年,1600年是閏年,1900年就不是閏年。此外,如果不能被100整除,而能被4整除的也是閏年,例如:2020,2016,2004,2008年都是閏年。

結(jié)合上述分析,我們可以使用代碼進(jìn)一步復(fù)現(xiàn):

import java.util.Scanner;

/**
 * switch和if結(jié)合使用
 *
 * @author iCode504
 * @date 2023-11-15
 */
public class SwitchDemo3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入年份: ");
        int year = scanner.nextInt();
        System.out.print("請輸入月份: ");
        int month = scanner.nextInt();
        int day = 0;
        switch (month) {
            // 利用switch的穿透性
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                day = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                day = 30;
                break;
            case 2:
                // 2月份需要額外針對年份進(jìn)行判斷
                if (year % 400 == 0) {
                    day = 29;
                } else if (year % 4 == 0 && year % 100 != 0) {
                    day = 28;
                }
                break;
            default:
                // 不在1-12月份內(nèi)做出說明
                System.out.println("無效的月份");
        }
        System.out.println(year + "年" + month + "月有" + day + "天");
    }
}

運(yùn)行結(jié)果:

以我個(gè)人的開發(fā)經(jīng)驗(yàn)來看,使用switch語句的頻率要比使用if語句要少很多,二者的執(zhí)行效率基本上差不太多。

if可以編寫更加靈活的條件表達(dá)式。比如:判斷某個(gè)整數(shù)在[10, 20]區(qū)間內(nèi),此時(shí)使用if條件表達(dá)式可以寫成if (number >= 10 && number <= 20),如果使用switch解決此問題會(huì)讓代碼變得更加復(fù)雜(因?yàn)槟阋獙懞芏鄠€(gè)case進(jìn)行比較)。

switch更擅長特定類型的值進(jìn)行比較。以上面根據(jù)某年某月求當(dāng)前月份由多少天為例,事實(shí)上完全使用if語句實(shí)現(xiàn),只不過我們需要寫成:

使用前面案例對應(yīng)的switch代碼,和if語句對比,個(gè)人覺得可讀性變高:

因此,使用if語句還是switch語句還是得根據(jù)具體的代碼場景而決定。

六、《阿里巴巴Java開發(fā)手冊》關(guān)于條件判斷語句的相關(guān)規(guī)范

1. 【強(qiáng)制】在一個(gè)switch塊內(nèi),每個(gè)case要么通過continue/break/return等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè)case為止;在一個(gè)switch塊內(nèi),都必須包含一個(gè)default語句并且放在最后,即使它什么代碼也沒有。

說明:注意break是退出switch語句塊,而return是退出方法體。

2. 【強(qiáng)制】當(dāng)switch括號(hào)內(nèi)的變量類型為String并且此變量為外部參數(shù)時(shí),必須先進(jìn)行null判斷。

反例:如下的代碼輸出內(nèi)容是什么?

public class SwitchString {
    public static void main(String[] args) {
		method(null);
	}
	public static void method(String param) {
		switch (param) {
			// 肯定不是進(jìn)入這里
			case "sth":
				System.out.println("it's sth");
				break;
			// 也不是進(jìn)入這里
			case "null":
				System.out.println("it's null");
				break;
			// 也不是進(jìn)入這里
			default:
			System.out.println("default");
		}
	}
}

3. 【強(qiáng)制】if/else/for/while/do語句中必須使用大括號(hào)。

說明:即使只有一行代碼,禁止不采用大括號(hào)的編碼方式:if (條件表達(dá)式) statements; ,上述代碼需改成如下格式:

if (條件表達(dá)式) {
	statements;
}

4. 【推薦】表達(dá)異常的分支時(shí),少用if-else方式,這種方式可以改寫成:

if (condition) { 
	...
	return obj;
}
// 接著寫 else 的業(yè)務(wù)邏輯代碼;

說明:如果非使用if()...else if()...else...方式表達(dá)邏輯,避免后續(xù)代碼維護(hù)困難,請勿超過 3 層。

正例:超過 3 層的if-else的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀態(tài)模式等來實(shí)現(xiàn),其中衛(wèi)語句示例如下(不了解衛(wèi)語句是什么的小伙伴可以參考這篇文章:點(diǎn)我查看):

public void findBoyfriend (Man man){
    if (man.isUgly()) {
        System.out.println("本姑娘是外貌協(xié)會(huì)的資深會(huì)員");
        return;
    }
    if (man.isPoor()) {
        System.out.println("貧賤夫妻百事哀");
        return;
    }
    if (man.isBadTemper()) {
        System.out.println("銀河有多遠(yuǎn),你就給我滾多遠(yuǎn)");
        return;
    }
    System.out.println("可以先交往一段時(shí)間看看");
}

5. 【推薦】避免采用取反邏輯運(yùn)算符。

說明:取反邏輯不利于快速理解,并且取反邏輯寫法必然存在對應(yīng)的正向邏輯寫法。

正例:使用if (x < 628)來表達(dá) x 小于 628。

反例:使用if (!(x >= 628))來表達(dá) x 小于 628。

七、知識(shí)點(diǎn)總結(jié)

流程控制之條件判斷知識(shí)點(diǎn)總結(jié)如下圖所示:

如需高清大圖,請點(diǎn)擊右側(cè)鏈接下載文件:點(diǎn)我下載

總結(jié)

以上是生活随笔為你收集整理的入门篇-其之九-流程控制之条件判断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。