第十一章 理解引數陣列

2022-04-07 09:02:45 字數 3136 閱讀 1080

假定要寫方法判斷作為引數傳遞的一組值中的最小值。乙個辦法是使用陣列。例如:為了查詢幾個int值中最小的。可以寫名為min的靜態方法,向其傳遞乙個int陣列,如下:

class util

public static int min(int paramlist)

if(paramlist == null || paramlist.length == 0)

throw new argumentexception("util.min:not enough arguments");

int currentmin = paramlist[0];

foreach(int i in paramlist)

if(icurrentmin=i;

為了使用min方法判斷兩個int變數(first和second)的最小值,可以像下面這樣寫:

int array = new int[2];

array [0] = first;

array [1] = second;

int min = util.min(array );

想要使用min方法判斷三個int變數(first、second和third)的最小值,可以像下面這樣寫:

int array = new int[3];

array [0] = first;

array [1] = second;

array [2] = third;

int min = util.min(array );

可以看出,這個方案避免了對大量過載的需要,但也為此付出了代價:必須編寫額外的**來填充傳入的陣列,當然,也可以像下面這樣使用匿名陣列:

int min = util.min(new int);

但本質沒有變化,仍然需要出建立和填充陣列,而且這個語法還有點兒不容易理解。解決方案是向min方法傳遞params關鍵字宣告的乙個引數陣列,讓編譯器自動生成這樣的**。

宣告引數陣列

引數陣列允許將數量可變的實參傳給方法。為了定義引數陣列,要用params關鍵字修飾陣列引數。如下

class util

public static int min(params int paramlist)

if(paramlist == null || paramlist.length == 0)

throw new argumentexception("util.min:not enough arguments");

int currentmin = paramlist[0];

foreach(int i in paramlist)

if(icurrentmin=i;

在這兒,params關鍵字對min方法產生的影響是:呼叫該方法時,可以傳遞任意數量的整數引數,而不必擔心建立陣列的問題。例如,判斷兩個int變數(first和second)的最小值

int min = util.min(first,second);

編譯器自動將上述呼叫轉換成如下**

int array = new int[2];

array [0] = first;

array [1] = second;

int min = util.min(array );

以下**判斷三個整數那個最小,它同樣被編譯器轉換成使用了陣列的等價**:

int min = util.min(first,second,third);

關於引數陣列,有以下幾點需要注意:

①只能為一維陣列使用params關鍵字,不能為多維陣列使用

不能只依賴params關鍵字來過載方法,params關鍵字不是方法簽名的一部分,如下所示

//編譯時錯誤:重複的宣告

public static int min(params int paramlist)

public static int min(int paramlist)

②不允許為引數陣列指定ref和out修飾符

//編譯時錯誤

public static int min(ref params int paramlist)

public static int min(out params int paramlist)

③params陣列必須是方法的最後乙個引數。這意味著每個方法只能有乙個引數陣列。如下所示

//編譯錯誤

public static int min(params int paramlist,int i)

④非params方法總是優先於params方法。也就是說,如果願意,仍然可以建立方法的過載版本,讓它應用於更常規的情況:

public static int min(int lefthandside,int righthandside)

public static int min(params int paramlist)

呼叫min時,如果傳遞了兩個int引數值,就使用min的第乙個版本。如果傳遞了其他任意的int引數值(其中包括無任何引數的情況),就使用第二個版本。

使用params object

假如引數數量不固定,引數型別也不固定。可以讓方法接收object型別的乙個引數陣列,從而接收任意數量的object引數,換言之,不僅引數的數量是任意的,引數型別也可以是任意的,如下:

class black

public static void hole(params object paramlist)

①可以不向它傳遞任何實參。這種情況下,編譯器傳遞長度為0的object陣列:

black.hole();

//轉換成black.hole(new object[0]);

②可以在呼叫black.hole時傳遞null作為實參,陣列是引用型別,所以允許使用null來初始化陣列:

black.hole(null);

③可以向black.hole方法傳遞乙個實際的陣列。也就是說,可以手動建立本應由編譯器建立的陣列:

object array = new object[3];

array [0] = "forty two";

array [1] = 42;

black.hole(array);

④可向black.hole傳遞不同型別的引數,這些引數自動包裝到陣列中

black.hole("forty two",42);

//轉換成black.hole(new object);

visual C (十一)理解引數陣列

11.3 比較引數陣列和可選引數 過載雖然很好用,但有時還是會不那麼方便,當引數數量變化時過載就很難解決了。c 提供一種技術允許只寫乙個方法就能接受數量可變的引數 引數陣列 關鍵字params宣告的引數 class util int currentmin paramlist 0 foreach in...

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...

第十一章3

第十一章 一 滾動元件 awt中的滾動元件包括scrollbar 滾動條 和滾動面板 scrollpane 兩種。1 滾動條scrollbar 在指定的取值範圍內快速選取某一值的功能。i.構造方法 public scrollbar int orientation,int value,int visi...