<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    gembin

    OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

    HBase, Hadoop, ZooKeeper, Cassandra

    Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

    There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

    About Me

     

    在Java1.5中創(chuàng)建可變參數(shù)[Varargs]

    方法重載是Java和其他面向?qū)ο笳Z(yǔ)言最具特色的特性之一。當(dāng)許多人可能認(rèn)為Java的優(yōu)勢(shì)是它的類(lèi)型,或者是它所帶的API庫(kù),其實(shí)讓相同的方法名與各種各樣可接受的參數(shù)搭配也是一件很好的事。

    Guitar guitar = new Guitar("Bourgeois", "Country Boy Deluxe",
    GuitarWood.MAHOGANY, GuitarWood.ADIRONDACK,1.718);
    Guitar guitar = new Guitar("Martin", "HD-28");
    Guitar guitar = new Guitar("Collings", "CW-28"
    GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,
    GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY);

    This code calls three versions of the constructor of a (fictional) Guitar class, meaning that information can be supplied when it’s available,rather than forcing a user to know everything about their guitar at one time (many professionals couldn’t tell you their guitar’s width at the nut).
    Here are the constructors used:
    public Guitar(String builder, String model) {
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,
    float nutWidth) {
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,
    float nutWidth,
    GuitarInlay fretboardInlay, GuitarInlay topInlay) {
    }

      這段代碼調(diào)用了Guitar類(lèi)中三個(gè)版本的構(gòu)造器,意味著當(dāng)信息可見(jiàn)時(shí),這些信息會(huì)被支持,而不是迫使每一個(gè)使用者每一次都要去了解關(guān)于Guitar類(lèi)的所有知識(shí)。許多專(zhuān)家不會(huì)在關(guān)鍵時(shí)候告訴你他們的Guitar的內(nèi)容。下面是用到的構(gòu)造器:

    public Guitar(String builder, String model) {
    }
    public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth) {
    }
    public Guitar(String builder, String model,GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
    GuitarInlay fretboardInlay, GuitarInlay topInlay) {
    }

      然而,當(dāng)你想要去增加無(wú)限的信息時(shí),事情開(kāi)始變得有一點(diǎn)不是那么有用了。例如:假設(shè)你想允許在這個(gè)構(gòu)造器中增加額外的未指明的特性。下面就是一些可能的調(diào)用的例子:

    Guitar guitar = new Guitar("Collings", "CW-28"
    GuitarWood.BRAZILIAN_ROSEWOOD, GuitarWood.ADIRONDACK,1.718,
    GuitarInlay.NO_INLAY, GuitarInlay.NO_INLAY,"Enlarged Soundhole", "No Popsicle Brace");
    Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");

      對(duì)于這兩個(gè)單獨(dú)的情況,你不得不去增加一個(gè)構(gòu)造器來(lái)接受兩個(gè)額外的字符串,另外一個(gè)構(gòu)造器來(lái)接受四個(gè)額外的字符串。試圖將這些相似的版本應(yīng)用于早已重載的構(gòu)造器。根據(jù)這樣的話(huà),你最終會(huì)得到20或30個(gè)那樣愚蠢的構(gòu)造器的版本!

      原因在于我們常稱(chēng)做的可變參數(shù)。可變參數(shù)是Tiger的增加的另一個(gè)特性,它用一種相當(dāng)巧妙的方法徹底地解決了這兒提出的問(wèn)題。這一章講述了這種相對(duì)簡(jiǎn)單的特性的各個(gè)方面。這將會(huì)使你迅速寫(xiě)出更好、更整潔、更靈活的代碼。

      創(chuàng)建一個(gè)可變長(zhǎng)度的參數(shù)列表

      可變參數(shù)使得你可以指定某方法來(lái)接受多個(gè)同一類(lèi)型的參數(shù),而且并不要求事先確定參數(shù)的數(shù)量(在編譯或運(yùn)行時(shí))。

      這就是Tiger的一個(gè)集成部分。事實(shí)上,正是因?yàn)镴ava語(yǔ)言的一些新特性組合在一起才表現(xiàn)出了可變參數(shù)的特性。

      我如何去實(shí)現(xiàn)呢?

      首先,你要習(xí)慣的書(shū)寫(xiě)省略號(hào)(……)。這三個(gè)小點(diǎn)是可變參數(shù)的關(guān)鍵,你將會(huì)經(jīng)常鍵入它們。下面是Guitar類(lèi)的構(gòu)造器使用可變參數(shù)來(lái)接受不確定數(shù)量字符串的一個(gè)例子:

    public Guitar(String builder, String model, String……features);

      參數(shù)String…… features 表明任何數(shù)量的字符串都可能被接受。 所以,下面所有的調(diào)用都合法的。

    Guitar guitar = new Guitar("Martin", "HD-28V","Hot-rodded by Dan Lashbrook", "Fossil Ivory Nut","Fossil Ivory Saddle", "Low-profile bridge pins");
    Guitar guitar = new Guitar("Bourgeois", "OMC","Incredible flamed maple bindings on this one.");
    Guitar guitar = new Guitar("Collings", "OM-42","Once owned by Steve Kaufman--one of a kind");
    You could add the same variable-length argument to the other constructors:
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,float nutWidth, String... features)
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
    GuitarInlay fretboardInlay,GuitarInlay topInlay,String... features)

      例5-1描寫(xiě)了一個(gè)把所有的這些特性放在一起的簡(jiǎn)單類(lèi),甚至使用XX來(lái)一起傳遞一些可變參數(shù)。

      Example 5-1. Using varargs in constructors

    package com.oreilly.tiger.ch05;
    public class Guitar {
    private String builder;
    private String model;
    private float nutWidth;
    private GuitarWood backSidesWood;
    private GuitarWood topWood;
    private GuitarInlay fretboardInlay;
    private GuitarInlay topInlay;
    private static final float DEFAULT_NUT_WIDTH = 1.6875f;
    public Guitar(String builder, String model, String... features) {
    this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,
    float nutWidth, String... features) {
    this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
    GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {
    this.builder = builder;
    this.model = model;
    this.backSidesWood = backSidesWood;
    this.topWood = topWood;
    this.nutWidth = nutWidth;
    this.fretboardInlay = fretboardInlay;
    this.topInlay = topInlay;
    }
    }

      剛才發(fā)生了什么?

      當(dāng)你指定了一個(gè)可變長(zhǎng)度參數(shù)列表,Java編譯器實(shí)際上讀入 “create an array of type <參數(shù)類(lèi)型>”。你鍵入:

    public Guitar(String builder, String model, String…… features)

      然而:編譯器解釋這些為:

    public Guitar(String builder, String model, String[] features)

      這意味著重復(fù)參數(shù)列表變得簡(jiǎn)單(這將在“重復(fù)可變長(zhǎng)度參數(shù)列表”里講述),這與你需要完成的其他程序設(shè)計(jì)目標(biāo)是一樣。

      你可以像使用數(shù)組一樣來(lái)使用可變參數(shù)。

      然而,這同樣存在一些限制。第一,在每個(gè)方法中,你只可以使用一次省略號(hào)。所以,下面的書(shū)寫(xiě)是不合法的:
    public Guitar(String builder, String model,String…… features, float…… stringHeights)

      另外,省略號(hào)必須作為方法的最后一個(gè)參數(shù)。

      如果你不需要傳遞任何可變參數(shù)呢?

      那沒(méi)關(guān)系,你只需要以舊的方式調(diào)用構(gòu)造器:

    Guitar guitar = new Guitar("Martin", "D-18");

      我們?cè)僮屑?xì)看看,雖然程序中沒(méi)有與下面代碼相匹配的構(gòu)造器:

    public Guitar(String builder, String model)

      那么,代碼到底傳遞了什么呢?作為可變參數(shù)的特例,在參數(shù)中不傳遞東西是一個(gè)合法的選項(xiàng)。所以,當(dāng)你看到 String…… features,你應(yīng)該把它認(rèn)為是零個(gè)或者更多個(gè)String參數(shù)。這省卻你再去創(chuàng)建另一個(gè)不帶可變參數(shù)構(gòu)造器的麻煩。

      重復(fù)可變長(zhǎng)度參數(shù)類(lèi)表

      所有這些可變參數(shù)是很好的。但是實(shí)際上,如果你不在你的方法中使用它們的話(huà),他們顯然僅僅是吸引眼球的東西或是窗戶(hù)的裝飾品而已。

      然而,你可以像你使用數(shù)組一樣來(lái)使用可變參數(shù),你會(huì)覺(jué)得這種用法很簡(jiǎn)單。

      那我怎么來(lái)使用可變參數(shù)呢?

      首先你要確保閱讀了“創(chuàng)建一個(gè)可變長(zhǎng)度的參數(shù)列表”,你會(huì)從中了解到可變參數(shù)方法最重要的東西,那就是我們把可變參數(shù)當(dāng)作數(shù)組來(lái)看待。

      所以,繼續(xù)前面的例子,你可以寫(xiě)出下面的代碼:

    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,float nutWidth,
    GuitarInlay fretboardInlay, GuitarInlay topInlay,String... features) {
    this.builder = builder;
    this.model = model;
    this.backSidesWood = backSidesWood;
    this.topWood = topWood;
    this.nutWidth = nutWidth;
    this.fretboardInlay = fretboardInlay;
    this.topInlay = topInlay;
    for (String feature : features) {
    System.out.println(feature);
    }
    }

      上面的這段代碼看上是不是不是那么的有吸引力?但這確實(shí)體現(xiàn)了可變參數(shù)的精髓。作為另一個(gè)例子,下面這個(gè)簡(jiǎn)單的方法從一組數(shù)字中計(jì)算出最大值:

    public static int max(int first, int... rest) {
    int max = first;
    for (int i : rest) {
    if (i > max)
    max = i;
    }
    return max;
    }

      是不是,夠簡(jiǎn)單吧?

      那么如何存儲(chǔ)可變長(zhǎng)度參數(shù)呢?

      正因?yàn)镴ava編譯器把這些看作數(shù)組,所以數(shù)組顯然是一個(gè)存儲(chǔ)的好選擇,這將在下面的例5-2中體現(xiàn)。

      Example 5-2. 存儲(chǔ)作為成員變量的可變參數(shù)

    package com.oreilly.tiger.ch05;
    public class Guitar {
    private String builder;
    private String model;
    private float nutWidth;
    private GuitarWood backSidesWood;
    private GuitarWood topWood;
    private GuitarInlay fretboardInlay;
    private GuitarInlay topInlay;
    private String[] features;
    private static final float DEFAULT_NUT_WIDTH = 1.6875f;
    public Guitar(String builder, String model, String... features) {
    this(builder, model, null, null, DEFAULT_NUT_WIDTH, null, null, features);
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,
    float nutWidth, String... features) {
    this(builder, model, backSidesWood, topWood, nutWidth, null, null, features);
    }
    public Guitar(String builder, String model,
    GuitarWood backSidesWood, GuitarWood topWood,
    float nutWidth,
    GuitarInlay fretboardInlay, GuitarInlay topInlay,
    String... features) {
    this.builder = builder;
    this.model = model;
    this.backSidesWood = backSidesWood;
    this.topWood = topWood;
    this.nutWidth = nutWidth;
    this.fretboardInlay = fretboardInlay;
    this.topInlay = topInlay;
    this.features = features;
    }
    }

      你可以簡(jiǎn)單地在Java的Collection類(lèi)中存儲(chǔ)這些可變參數(shù)。

    //變量聲明
    private List features;
    //在方法中或是構(gòu)造器中的書(shū)寫(xiě)
    this.features = java.util.Arrays.asList(features);

      允許零長(zhǎng)度的參數(shù)列表

      可變參數(shù)的一個(gè)顯著的特性是可變長(zhǎng)度參數(shù)可以接受零到N個(gè)參數(shù)。這就意味著你可以調(diào)用這些方法中的一個(gè)方法而不傳遞任何參數(shù),程序同樣可以運(yùn)行。從另一方面來(lái)說(shuō),這又意味著,作為一個(gè)程序員,你最好意識(shí)到你必須防范這種情況的發(fā)生。

      如何實(shí)現(xiàn)它呢?

      記得在“重復(fù)可變長(zhǎng)度參數(shù)類(lèi)表”中,你讀到過(guò)下面這個(gè)簡(jiǎn)單的方法:

    public static int max(int first, int... rest) {
    int max = first;
    for (int i : rest) {
    if (i > max)
    max = i;
    }
    return max;
    }

      你可以以多種形式來(lái)調(diào)用這個(gè)方法:

    int max = MathUtils.max(1, 4);
    int max = MathUtils.max(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    int max = MathUtils.max(18, 8, 4, 2, 1, 0);

      有一點(diǎn)不是那么令人滿(mǎn)意的地方是,在很多情況下,你要傳遞的數(shù)字已經(jīng)存儲(chǔ)在數(shù)組里,或是至少是在某些集成的形式中:

      //用這種方法來(lái)取得數(shù)字

    int[] numbers = getListOfNumbers( );

      要把這些數(shù)字傳遞給max()方法是不可能的。你需要檢查list的長(zhǎng)度,從中截取掉第一個(gè)對(duì)象(如果存在第一個(gè)對(duì)象的話(huà)),然后檢查類(lèi)型來(lái)確 保是int型。完成了這些,你才可以帶著數(shù)組中剩余的部分一起傳遞進(jìn)入方法。而這數(shù)組中剩余的部分還要重復(fù),或者要人工地轉(zhuǎn)化為適合的格式。總之,這個(gè)過(guò) 程會(huì)很辛苦,你需要做許多瑣碎的事情。仔細(xì)想想,你要記得編譯器是將這個(gè)方法解釋為下面的語(yǔ)句:public static int max(int first, int[] rest)

      所以,你可以做些調(diào)整,把max()方法改寫(xiě)成下面這個(gè)樣子:

    public static int max(int... values) {
    int max = Integer.MIN_VALUE;
    for (int i : values) {
    if (i > max)
    max = i;
    }
    return

      你現(xiàn)在已經(jīng)定義了一個(gè)可以很容易接受數(shù)組的方法。

    //用這種方法來(lái)取得數(shù)字
    int[] numbers = getListOfNumbers( );
    int max = MathUtils.max(numbers);

      當(dāng)接受單一的可變長(zhǎng)度參數(shù)時(shí),你使用這種方法會(huì)很簡(jiǎn)單。但是,如果在最好的情況下,你傳遞了一個(gè)零長(zhǎng)度的數(shù)組進(jìn)去,這就會(huì)帶來(lái)問(wèn)題,你會(huì)得到難 以預(yù)料的結(jié)果。為了解決這個(gè)問(wèn)題,你需要一個(gè)小的錯(cuò)誤檢查。例5-3是MathUtils類(lèi)的完整代碼列表,在這里是一個(gè)功能更強(qiáng)的MathUtil類(lèi)。

      例5-3 處理零參數(shù)的方法

    package com.oreilly.tiger.ch05;
    public class MathUtils {
    public static int max(int... values) {
    if (values.length == 0) {
    throw new IllegalArgumentException("No values supplied.");
    }

      任何時(shí)候,你都可能會(huì)要處理零長(zhǎng)度的參數(shù)列表,這時(shí)你就需要執(zhí)行這類(lèi)的錯(cuò)誤檢查。通常,一個(gè)功能強(qiáng)大的IllegalArgumentException類(lèi)是一個(gè)好的選擇。

    int max = Integer.MIN_VALUE;
    for (int i : values) {
    if (i > max)
    max = i;
    }
    return max;
    }
    }

      那么關(guān)于調(diào)用同樣的方法來(lái)處理通常參數(shù)不是數(shù)組的方法,又會(huì)如何呢?這當(dāng)然是完全合法的。下面的代碼都是合法調(diào)用max()方法的手段:

    int max = MathUtils.max(myArray);
    int max = MathUtils.max(new int[] { 2, 4, 6, 8 });
    int max = MathUtils.max(2, 4, 6, 8);
    int max = MathUtils.max(0);
    int max = MathUtils.max( );

      指定對(duì)象參數(shù),而非基本類(lèi)型

      在第四章中我們談到,Tiger通過(guò)拆箱增加了一系列的新特征。你可以在處理可變參數(shù)時(shí),在你的方法接受的參數(shù)中使用對(duì)象包裝類(lèi)。

      如何實(shí)現(xiàn)?

      你一定記得在Java中所有的類(lèi)最終都是java.lang.Object的子類(lèi)。這就意味著任何對(duì)象可以被轉(zhuǎn)化成一個(gè)Object對(duì)象。更進(jìn) 一步說(shuō),因?yàn)橄駃nt和short這樣的基本類(lèi)型會(huì)自動(dòng)轉(zhuǎn)化成他們對(duì)應(yīng)的對(duì)象包裝類(lèi)(就像Integer和Short),任何Java類(lèi)型可以被轉(zhuǎn)化成一 個(gè)Object對(duì)象。

      所以,如果你需要你的可變參數(shù)方法可以接受最多種參數(shù)的類(lèi)型,那么你可以將Object類(lèi)型作為參數(shù)的類(lèi)型。更好的是,為了達(dá)到多重功能,絕大多數(shù)情況下都會(huì)使用Object對(duì)象。例如,寫(xiě)個(gè)用來(lái)打印方法。

    private String print(Object... values) {
    StringBuilder sb = new StringBuilder( );
    for (Object o : values) {
    sb.append(o)
    .append(" ");
    }
    return sb.toString( );
    }

      這兒最簡(jiǎn)單的意思是打印出所有的東西。然而,這個(gè)方法更通用的定義是下面的樣子:

    private String print(String... values) {
    StringBuilder sb = new StringBuilder( );
    for (Object o : values) {
    sb.append(o)
    .append(" ");
    }
    return sb.toString( );
    }

      這個(gè)方法的問(wèn)題是方法自身不能接受字符串,整數(shù),浮點(diǎn)數(shù),數(shù)組和其他的類(lèi)型數(shù)據(jù),而這些數(shù)據(jù)你都想要正常的打印出來(lái)。通過(guò)使用Object這個(gè)更為通用的類(lèi)型,你可以來(lái)打印所有的一切。

    private String print(Object... values) {
    StringBuilder sb = new StringBuilder( );
    for (Object o : values) {
    sb.append(o)
    .append(" ");
    }
    return sb.toString( );
    }

      避免數(shù)組自動(dòng)轉(zhuǎn)化

      Tiger增加了各種類(lèi)型的自動(dòng)轉(zhuǎn)化和便利,這些東西在絕大多數(shù)的情況下是很好用的。不幸的是,有些時(shí)候所有的這些東西會(huì)變成你的障礙。其中一 種情況是,在可變參數(shù)方法中將多個(gè)Object對(duì)象轉(zhuǎn)化為Object[]數(shù)組對(duì)象,你會(huì)發(fā)現(xiàn)在個(gè)別的情況下,你需要用Java來(lái)書(shū)寫(xiě)。

      如何實(shí)現(xiàn)?

      在將要仔細(xì)討論這件事情前,你要確信自己理解這個(gè)問(wèn)題。Java新的printf()方法是一個(gè)很好的便利,舉這個(gè)方法作個(gè)例子:

    System.out.printf("The balance of %s's account is $%(,6.2f\n",account.getOwner()。getFullName( ),account.getBalance( ));

      如果你看一下Java文檔中關(guān)于printf()方法的說(shuō)明,你就會(huì)看到它是一個(gè)可變參數(shù)的方法。它有兩個(gè)參數(shù):一個(gè)是用于設(shè)置字符串格式的String類(lèi)型變量,另一個(gè)是所有要傳遞進(jìn)字符串的Object對(duì)象:

    PrintStream printf(String format, Object…… args)

      現(xiàn)在,你可以把上面的代碼默認(rèn)為下面的形式:

    PrintStream printf(String format, Object[] args)

      兩種書(shū)寫(xiě)是不是完全相同呢?大多數(shù)情況下是相同的。考慮一下下面的代碼:

    Object[] objectArray = getObjectArrayFromSomewhereElse( );out.printf("Description of object array: %s\n", obj);

      這是乎有點(diǎn)牽強(qiáng),然而要把它看作是為了自省的代碼而付出的正常開(kāi)銷(xiāo)。比起其它代碼,這樣寫(xiě)要簡(jiǎn)潔的多。如果你正在編寫(xiě)一個(gè)代碼分析工具,或者一 個(gè)集成開(kāi)發(fā)環(huán)境,或者其他可能使用reflection或簡(jiǎn)單API來(lái)判斷出應(yīng)用程序會(huì)需要何種對(duì)象的東西,這些馬上會(huì)成為一個(gè)通用的案例。這兒,你不是 真正關(guān)心對(duì)象數(shù)組的內(nèi)容,就像你同樣不會(huì)去關(guān)心數(shù)組自身一樣。它是什么類(lèi)型?它的內(nèi)存地址是多少?它的字符串代表什么意思?請(qǐng)緊記所有這些問(wèn)題都是和數(shù)組 本身有關(guān)的,和數(shù)組的內(nèi)容無(wú)關(guān)。例如:我們來(lái)看看下面的數(shù)組代碼:

    public Object[] getObjectArrayFromSomewhereElse( ) {return new String[] {"Hello", "to", "all", "of", "you"};}

      在這種情況下,你肯能會(huì)寫(xiě)一些像下面一樣的代碼來(lái)回答某些關(guān)于數(shù)組的問(wèn)題:

    out.printf("Description of object array: %s\n", obj);

      然而,輸出結(jié)果并不是你所期望的那樣:

    run-ch05:[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook[echo] Running VarargsTester……[java] Hello

      這倒是怎么回事?這就不是你想看到的結(jié)果。然而,編譯器做了它應(yīng)該做的,它把在printf()方法里的Object……轉(zhuǎn)換為 Object[].實(shí)際上,當(dāng)編譯器得到你方法的調(diào)用時(shí),它看到的參數(shù)是Object[].所以編譯器不是把這個(gè)數(shù)組看作一個(gè)Object對(duì)象本身,而是 把它分成不同的部分。這樣被傳遞給字符串格式 (%s)的就是第一個(gè)參數(shù)部分“Hello”字符串,所以結(jié)果“Hello”就顯示出來(lái)了。

      仔細(xì)看看這件事,你需要去告訴編譯器你要把整個(gè)對(duì)象數(shù)組obj看作是一個(gè)簡(jiǎn)單的對(duì)象,而不是一組參數(shù)。請(qǐng)看下面奇特的代碼:

    out.printf("Description of object array: %s\n", new Object[] { obj });

      作為選擇,還有一種更為簡(jiǎn)單的方法:

    out.printf("Description of object array: %s\n", (Object)obj);

      在上面兩種書(shū)寫(xiě)情況下,編譯器不再認(rèn)為是對(duì)象的數(shù)組,而是直接認(rèn)為是一個(gè)簡(jiǎn)單的Object對(duì)象,而這個(gè)Object對(duì)象又恰好是一個(gè)對(duì)象數(shù)組。那么結(jié)果就如你所愿(至少在這種簡(jiǎn)單的應(yīng)用下):

    run-ch05:[echo] Running Chapter 5 examples from Java Tiger: A Developer's Notebook[echo] Running VarargsTester……[java] [Ljava.lang.String;@c44b88

      看到結(jié)果,你肯能會(huì)感到有點(diǎn)錯(cuò)亂。這大概是基于reflection或者其他自省代碼需要的結(jié)果。

    posted on 2008-08-07 18:12 gembin 閱讀(354) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JavaSE

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(6)

    隨筆分類(lèi)(440)

    隨筆檔案(378)

    文章檔案(6)

    新聞檔案(1)

    相冊(cè)

    收藏夾(9)

    Adobe

    Android

    AS3

    Blog-Links

    Build

    Design Pattern

    Eclipse

    Favorite Links

    Flickr

    Game Dev

    HBase

    Identity Management

    IT resources

    JEE

    Language

    OpenID

    OSGi

    SOA

    Version Control

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    free counters
    主站蜘蛛池模板: 国产乱子伦片免费观看中字| 亚洲第一页在线视频| 中文有码亚洲制服av片| 国色精品va在线观看免费视频 | 亚洲精品无码成人片久久| 亚洲国产美女精品久久久| 91成人在线免费视频| 亚洲色欲久久久综合网| 亚洲AV色欲色欲WWW| 国内精自视频品线六区免费| 亚洲成AV人片在线播放无码| 成人免费视频一区二区| 色播在线永久免费视频| 亚洲国产成人久久综合一区| 久久99热精品免费观看牛牛| 国产成人亚洲综合| 久久亚洲精品11p| 成年女人毛片免费播放视频m | 男女污污污超污视频免费在线看| 国拍在线精品视频免费观看| 免费在线观看一级片| 中文字幕第13亚洲另类| 视频一区在线免费观看| 日本人的色道www免费一区| 亚洲av一本岛在线播放| 1000部羞羞禁止免费观看视频| 国产亚洲一区二区三区在线| eeuss免费影院| 亚洲 无码 在线 专区| 亚洲av色香蕉一区二区三区蜜桃| 成人女人A级毛片免费软件| 亚洲精品国产免费| 99re在线精品视频免费| 亚洲an天堂an在线观看| 日韩免费电影网址| 久久精品亚洲综合专区| 日本免费人成网ww555在线 | 日韩精品亚洲人成在线观看| 美女视频黄的免费视频网页| 久久九九亚洲精品| 成全视频在线观看免费|