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

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

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

        JAVA字符謎題2:ABC

        字號:

        這個謎題要問的是一個悅耳的問題,下面的程序?qū)⒋蛴∈裁茨兀?BR>    public class ABC{
             public static void main(String[] args){
             String letters = "ABC";
             char[] numbers = {’1’, ’2’, ’3’};
             System.out.println(letters + " easy as " + numbers);
             }
            }
             可能大家希望這個程序打印出ABC easy as 123。遺憾的是,它沒有。如果你運(yùn)行它,就會發(fā)現(xiàn)它打印的是諸如ABC easy as [C@16f0472之類的東西。為什么這個輸出會如此丑陋?
            盡管char是一個整數(shù)類型,但是許多類庫都對其進(jìn)行了特殊處理,因?yàn)閏har數(shù)值通常表示的是字符而不是整數(shù)。例如,將一個char數(shù)值傳遞給println方法會打印出一個Unicode字符而不是它的數(shù)字代碼。字符數(shù)組受到了相同的特殊處理:println的char[]重載版本會打印出數(shù)組所包含的所有字符,而String.valueOf和StringBuffer.append的char[]重載版本的行為也是類似的。
            然而,字符串連接操作符在這些方法中沒有被定義。該操作符被定義為先對它的兩個操作數(shù)執(zhí)行字符串轉(zhuǎn)換,然后將產(chǎn)生的兩個字符串連接到一起。對包括數(shù)組在內(nèi)的對象引用的字符串轉(zhuǎn)換定義如下[JLS 15.18.1.1]:
            如果引用為null,它將被轉(zhuǎn)換成字符串"null"。否則,該轉(zhuǎn)換的執(zhí)行就像是不用任何參數(shù)調(diào)用該引用對象的toString方法一樣;但是如果調(diào)用toString方法的結(jié)果是null,那么就用字符串"null"來代替。
            那么,在一個非空char數(shù)組上面調(diào)用toString方法會產(chǎn)生什么樣的行為呢?數(shù)組是從Object那里繼承的toString方法[JLS 10.7],規(guī)范中描述到:“返回一個字符串,它包含了該對象所屬類的名字,’@’符號,以及表示對象散列碼的一個無符號十六進(jìn)制整數(shù)”[Java-API]。有關(guān)Class.getName的規(guī)范描述到:在char[]類型的類對象上調(diào)用該方法的結(jié)果為字符串"[C"。將它們連接到一起就形成了在我們的程序中打印出來的那個丑陋的字符串。
            有兩種方法可以訂正這個程序。你可以在調(diào)用字符串連接操作之前,顯式地將一個數(shù)組轉(zhuǎn)換成一個字符串:
            System.out.println(letters + " easy as " +
             String.valueOf(numbers));
            或者,你可以將System.out.println調(diào)用分解為兩個調(diào)用,以利用println的char[]重載版本:
            System.out.print(letters + " easy as ");
            System.out.println(numbers);
             請注意,這些訂正只有在你調(diào)用了valueOf和println方法正確的重載版本的情況下,才能正常運(yùn)行。換句話說,它們嚴(yán)格依賴于數(shù)組引用的編譯期類型。
            下面的程序說明了這種依賴性??雌饋硭袷撬枋龅牡诙N訂正方式的具體實(shí)現(xiàn),但是它產(chǎn)生的輸出卻與最初的程序所產(chǎn)生的輸出一樣丑陋,因?yàn)樗{(diào)用的是println的Object重載版本,而不是char[]重載版本。
            class ABC2{
             public static void main(String[] args){
             String letters = "ABC";
             Object numbers = new char[] { ’1’, ’2’, ’3’ };
             System.out.print(letters + " easy as ");
             System.out.println(numbers);
             }
            }
             總之,char數(shù)組不是字符串。要想將一個char數(shù)組轉(zhuǎn)換成一個字符串,就要調(diào)用String.valueOf(char[])方法。某些類庫中的方法提供了對char數(shù)組的類似字符串的支持,通常是提供一個Object版本的重載方法和一個char[]版本的重載方法,而之后后者才能產(chǎn)生我們想要的行為。
            對語言設(shè)計者的教訓(xùn)是:char[]類型可能應(yīng)該覆寫toString方法,使其返回數(shù)組中包含的字符。更一般地講,數(shù)組類型可能都應(yīng)該覆寫toString方法,使其返回數(shù)組內(nèi)容的一個字符串表示。