亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        Java字符謎題1:最后的笑聲

        字號:

        下面的程序?qū)⒋蛴〕鍪裁茨兀?BR>    public class LastLaugh{
             public static void main(String[] args){
             System.out.print("H"+"a");
             System.out.print(’H’+’a’);
             }
            }
            你可能會認(rèn)為這個程序?qū)⒋蛴aHa。該程序看起來好像是用兩種方式連接了H和a,但是你所見為虛。如果你運行這個程序,就會發(fā)現(xiàn)它打印的是Ha169。那么,為什么它會產(chǎn)生這樣的行為呢?
            正如我們所期望的,第一個對System.out.print的調(diào)用打印的是Ha:它的參數(shù)是表達(dá)式"H"+"a",顯然它執(zhí)行的是一個字符串連接。而第二個對System.out.print的調(diào)用就是另外一回事了。問題在于’H’和’a’是字符型字面常量,因為這兩個操作數(shù)都不是字符串類型的,所以 + 操作符執(zhí)行的是加法而不是字符串連接。
            編譯器在計算常量表達(dá)式’H’+’a’時,是通過我們熟知的拓寬原始類型轉(zhuǎn)換將兩個具有字符型數(shù)值的操作數(shù)(’H’和’a’)提升為int數(shù)值而實現(xiàn)的。從char到int的拓寬原始類型轉(zhuǎn)換是將16位的char數(shù)值零擴展到32位的int。對于’H’,char數(shù)值是72,而對于’a’,char數(shù)值是97,因此表達(dá)式’H’+’a’等價于int常量72 + 97,或169。
            站在語言的立場上,若干個char和字符串的相似之處是虛幻的。語言所關(guān)心的是,char是一個無符號16位原始類型整數(shù)——而已。對類庫來說就不盡如此了,類庫包含了許多可以接受char參數(shù),并將其作為Unicode字符處理的方法。
            那么你應(yīng)該怎樣將字符連接在一起呢?你可以使用這些類庫。例如,你可以使用一個字符串緩沖區(qū):
            StringBuffer sb = new StringBuffer();
            sb.append(’H’);
            sb.append(’a’);
            System.out.println(sb);
            這么做可以正常運行,但是顯得很丑陋。其實我們還是有辦法去避免這種方式所產(chǎn)生的拖沓冗長的代碼。 你可以通過確保至少有一個操作數(shù)為字符串類型,來強制 + 操作符去執(zhí)行一個字符串連接操作,而不是一個加法操作。這種常見的慣用法用一個空字符串("")作為一個連接序列的開始,如下所示:
             System.out.println("" + ’H’ + ’a’);
            這種慣用法可以確保子表達(dá)式都被轉(zhuǎn)型為字符串。盡管這很有用,但是多少有一點難看,而且它自身可能會引發(fā)某些混淆。你能猜到下面的語句將會打印出什么嗎?如果你不能確定,那么就試一下:
             System.out.print("2 + 2 = " + 2+2);
            如果使用的是JDK 5.0,你還可以使用
             System.out.printf("%c%c", ’H’, ’a’);
            總之,使用字符串連接操作符使用格外小心。+ 操作符當(dāng)且僅當(dāng)它的操作數(shù)中至少有一個是String類型時,才會執(zhí)行字符串連接操作;否則,它執(zhí)行的就是加法。如果要連接的沒有一個數(shù)值是字符串類型的,那么你可以有幾種選擇:
            預(yù)置一個空字符串;
            將第一個數(shù)值用String.valueOf顯式地轉(zhuǎn)換成一個字符串;
            使用一個字符串緩沖區(qū);
            或者如果你使用的JDK 5.0,可以用printf方法。
            這個謎題還包含了一個給語言設(shè)計者的教訓(xùn)。操作符重載,即使在Java中只在有限的范圍內(nèi)得到了支持,它仍然會引起混淆。為字符串連接而重載 + 操作符可能就是一個已鑄成的錯誤。