J2SE 5 0新特性(五)可變長引數

2021-05-24 06:05:08 字數 2144 閱讀 7739

可變長引數是j2se5新入的乙個特性,故名思義就是可以建立數目可變的引數方法,簡稱varargs方法。

需要將數目不定的引數傳遞給乙個方法的情況很常見,當然在這個新特性被引入之前,我們遇到這種情況通常情況下有兩種方案來解決:一、如果需要的引數數目不大而且可知,我們可採用過載的形式來滿足,每不同的引數建立不同形式的方法,這種方案有其可適用的場事,但適用範圍比較窄。二、如果引數數目大而且未知,那麼我們可將不定引數儲存在乙個集合中或陣列中現傳遞給方法,根據一系列的判斷來分離出各個引數,並加以利用,這種方案繁瑣而且容易出錯。

*************************writed by jack.hao on 2011.01.20********************====

使用可變長引數,最典型的乙個例子是,printf()方法,它接受乙個數目可變的引數,並將它們格式化後輸出。針對以上的需求及現今的瓶頸,j2se5引入了可變長引數的概念。 varargs特性提供了乙個更簡單、更好的選擇。乙個變長引數由三個句點(...)來指定。

例:static void vartest( string ... v )

該語法告訴編譯器呼叫vartest()的引數的數目是可變的、不確定的,可是零或更多。那麼這些引數我們如何使用呢?可變長引數被隱式地轉換為乙個相應型別的陣列物件。我們可通過陣列下標的方式進行引用。下面給出乙個相對完整的例子: 注:

1>使用可變長引數會傳遞的內容會被隱式封裝成乙個相應型別的陣列,引數可有可無,如果沒有引數,會被轉換為乙個長度為零的陣列。

2>varargs引數必須是方法的最後乙個引數,切記!

void vartest( int a  , int b , string ... more )     //ok

void vartest( int a , string ... more , int b )     //error

下面我們寫乙個變長引數與其它引數共用的情況,如下:

*************************writed by jack.hao on 2011.01.20********************====

一)過載varargs方法

根據需求,可以過載乙個可變長引數的方法,來滿足你的需要。如下:

那麼既然引數是不定的,過載後的方法,編譯器是根據什麼來指定對應的方法來執行的呢?首先vararg是根據引數型別的不同,來進行區分的。其次,如果某個過載方法增加了乙個或多個正常引數,根據正常引數的數量及型別來進行區分。

如果,這二種方案均不能區分出那底要用那個,那麼你擔心的沒錯,麻煩出錯了,這就是我們下邊要說明的乙個問題,請往下看...

*************************writed by jack.hao on 2011.01.20********************====

二)varargs方法的模糊性

我們接著上邊的話題,如果我們對可變長引數的方法進行過載,那麼可能會引出乙個新的問題。如果我們對乙個可變長引數方法進行了多次過載,在我們呼叫時,傳遞的引數,此時可以多個可變長引數方法的要求,那麼,這時我們編譯程式時,編譯器就會報錯,因為它無法決定到底要呼叫那個方法好,這種錯誤是由於模糊性所造成的。

如下例項:

如上邊例子,如果我們呼叫vartest()無參方法時就會發生錯誤,因為此時vartest( boolean ... bvars )與vartest( int ... ivars)這兩個過載方法都滿足,那麼編譯器將無法決定要調那乙個,就會發生模糊錯誤。

下邊是另乙個模糊型情況:

static void vartest(int i )

static void vartest(int i , int ... v )

以上雖然有乙個過載方法使用的乙個正常引數,但是當我們使用vartest(1);之樣的引數進行呼叫時還是會發生模糊型錯誤,原因與上邊相同,因為以上的呼叫完全滿足那兩個過載方法,所以,編譯此時又不知道如何是好了。

有些時候,由於過載方法的模糊性缺陷,使我們不得不放棄變長引數方法的過載,使用兩個完全不同的方法名來解決。但多數情況,我們可以從設計的角度避免掉這樣事情的發生。我們可以調換正常引數的位置,比如以上情況,我們是不是可以只使用vartest(int ...v來代替過載呢?當然具體情況,具體分析。總之來說,可變長引數的推出,還是為我們的編碼工作帶來了很大的方便。

好了,寫成這裡,該出休息了......

J2SE5 0新特性之可變長引數

j2se5.0 新特性之可變長引數 晁嶽攀 allnest 163.有時候,我們傳入到方法的引數的個數是不固定的,為了解決這個問題,我們一般採用下面的方法 1 過載,多過載幾個方法,盡可能的滿足引數的個數。顯然這不是什麼好辦法。2 將引數作為乙個陣列傳入。雖然這樣我們只需乙個方法即可,但是,為了傳遞...

J2SE5 0新特性之可變長引數

有時候,我們傳入到方法的引數的個數是不固定的,為了解決這個問題,我們一般採用下面的方法 1 過載,多過載幾個方法,盡可能的滿足引數的個數。顯然這不是什麼好辦法。2 將引數作為乙個陣列傳入。雖然這樣我們只需乙個方法即可,但是,為了傳遞這個陣列,我們需要先宣告乙個陣列,然後將引數乙個乙個加到陣列中。現在...

J2SE5 0新特性之可變長引數

有時候,我們傳入到方法的引數的個數是不固定的,為了解決這個問題,我們一般採用下面的方法 1 過載,多過載幾個方法,盡可能的滿足引數的個數。顯然這不是什麼好辦法。2 將引數作為乙個陣列傳入。雖然這樣我們只需乙個方法即可,但是,為了傳遞這個陣列,我們需要先宣告乙個陣列,然後將引數乙個乙個加到陣列中。現在...