J2SE綜合:使用條件運(yùn)算符的陣痛

字號(hào):

一、案例編號(hào):
    U02C09
    二、案例名稱:
    使用條件運(yùn)算符的陣痛
    三、關(guān)鍵詞:
    條件運(yùn)算符、三目運(yùn)算符、三元運(yùn)算符、類型轉(zhuǎn)換
    四、案例情景描述:
    條件運(yùn)算符有三個(gè)操作數(shù)。它的形式是:boolean-exp?exp1:exp2。它首先計(jì)算boolean表達(dá)式的值,如果為true那么整個(gè)表達(dá)式的值就是表達(dá)式exp1的值,如果boolean表達(dá)式的值為false,那么整個(gè)表達(dá)式的值就是exp2的值。
    intk=(2>3)?23:45;因?yàn)閎oolean表達(dá)式2>3為false,所以k的值是45。
    (1)
    charx=‘A’;  //line1
    inti=0;  //line2
    System.out.println(true?x:0);  //line3
    System.out.println(true?x:1111111110);  //line4
    System.out.println(false?i:x);  //line5
    (2)
    /*
    *假設(shè)Test是已經(jīng)定義的某個(gè)類
    */
    Testt=flase?newObject():newTest();
    五、案例理論分析:
    1、我們先看第一個(gè)代碼片段:三個(gè)輸出語(yǔ)句會(huì)輸出什么結(jié)果呢?
    你也行會(huì)認(rèn)為輸出結(jié)果是:
    'A'
    'A'
    'A'
    當(dāng)你運(yùn)行一下這段代碼,它的真正結(jié)果是:
    'A'
    65
    65
    為什么會(huì)有這樣的結(jié)果呢?實(shí)質(zhì)上這就是條件運(yùn)算符對(duì)于運(yùn)算結(jié)果類型的限制:
    (1)如果表達(dá)式1和表達(dá)式2具有相同的類型,那么整個(gè)條件運(yùn)算符結(jié)果的類型就是這個(gè)類型。
    (2)如果一個(gè)表達(dá)式的類型是T,T是byte或short或char,另一個(gè)表達(dá)式的類型是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值是可以用類型T表示的(也就是說(shuō),常量表達(dá)式的值是在類型T的取值范圍之內(nèi)),那么整個(gè)條件運(yùn)算符結(jié)果的類型就是T。
    (3)除以上情況外,如果表達(dá)式1和表達(dá)式2的類型不同,那么將進(jìn)行類型提升,整個(gè)條件運(yùn)算符結(jié)果的類型就是提升后的類型。
    System.out.println(true?x:0);  //line3。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值0可以用char類型來(lái)表示,因此整個(gè)條件運(yùn)算符結(jié)果的類型就應(yīng)當(dāng)是char類型,所以輸出的結(jié)果就是'A'。
    System.out.println(true?x:1111111110);  //line4。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,但是這個(gè)常量表達(dá)式的值已經(jīng)超出了char類型的取值范圍,因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型了,所以輸出的結(jié)果是65(字符A的ASCII碼)。
    System.out.println(false?i:x);  //line5。表達(dá)式1是int類型的變量,表達(dá)式2是char類型的變量,沒有常量表達(dá)式。因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型。所以輸出結(jié)果就是65。
    2、我們?cè)倏吹诙€(gè)代碼片段,它的結(jié)果是在編譯階段引發(fā)錯(cuò)誤。為什么?
    Testt=flase?newObject():newTest();我們看到表達(dá)式1是Object類型,表達(dá)式2是Test類型。沒有常量表達(dá)式,類型不同,因此要進(jìn)行類型提升的。要把Test類型提升為Object類型,因此整個(gè)條件運(yùn)算符結(jié)果的類型應(yīng)當(dāng)是Object類型。當(dāng)在賦值的時(shí)候要把Object類型賦值給Test類型的變量,當(dāng)然會(huì)引發(fā)編譯錯(cuò)誤。