Java 中的 VarArgs 與數組輸入參數
一、概述
在本教程中,我們將探討 Java 中method(String… args)
和method(String[] args)
之間的區別。在此過程中,我們將檢查如何將數組或可變長度參數列表傳遞給方法。
2. 將數組傳遞給方法
在本節中,我們將展示如何將String
類型的數組聲明為方法的參數,以及如何在方法調用期間將相同類型的數組作為參數傳遞。
Java 是一種靜態類型的編程語言,這意味著變量類型在編譯時是已知的。程序員必須聲明變量類型,原始類型或引用類型。當定義一個帶有數組參數的方法時,我們期望在方法調用期間聲明我們希望作為參數傳遞的數組類型。
讓我們看看在方法頭中定義String
數組參數的語法:
void capitalizeNames(String[] args)
讓我們分解上面方法頭中聲明的參數:
-
String[]
– 類型名稱 -
args
參數名稱
void capitalizeNames(String[] args) {
for(int i = 0; i < args.length; i++){
args[i] = args[i].toUpperCase();
}
}
從上面可以看出, capitalizeNames()
方法有一個String
數組參數args.
方法頭指定該方法在調用時僅接收一個java.lang.String[]
類型的數組引用。
本質上,當我們在方法頭中遇到(String[] args)
時,我們應該理解該方法在調用時採用單個String
類型的數組作為參數。
讓我們看一個例子:
@Test
void whenCheckingArgumentClassName_thenNameShouldBeStringArray() {
String[] names = {"john", "ade", "kofi", "imo"};
assertNotNull(names);
assertEquals("java.lang.String[]", names.getClass().getTypeName());
capitalizeNames(names);
}
當我們檢查capitalizeNames()
方法參數的類名names
時,我們得到java.lang.String[]
,它與方法定義中的參數匹配。如果我們嘗試將不同的類型作為參數傳遞給該方法,則會出現編譯錯誤:
@Test
void whenCheckingArgumentClassName_thenNameShouldBeStringArray() {
...
int[] evenNumbers = {2, 4, 6, 8};
capitalizeNames(evenNumbers);
}
上面的代碼片段將在我們的控制台上輸出編譯器錯誤消息:
incompatible types: int[] cannot be converted to java.lang.String[]
3.可變長度參數列表
可變長度參數列表,在 Java 中也稱為varargs
,允許我們在方法調用期間傳遞任意數量的相同類型的參數。
方法中可變長度參數列表的語法如下所示:
String[] firstLetterOfWords(String... args)
讓我們分解上面方法頭中聲明的參數:
-
String…
– 帶省略號的類型名稱 -
args
參數名稱
String[] firstLetterOfWords(String... args) {
String[] firstLetter = new String[args.length];
for(int i = 0; i < args.length; i++){
firstLetter[i] = String.valueOf(args[i].charAt(0));
}
return firstLetter;
}
我們在方法簽名中聲明參數類型後跟省略號 (...) 和參數名稱。
使用可變長度參數列表,我們可以將任意數量的相同類型的參數添加到一個方法中,因為 Java 將給定的參數作為數組中的元素來處理。添加varargs
作為方法參數的一部分時,請確保類型、省略號和參數名稱位於最後。
例如,這是不正確的:
static String[] someMethod(String... args, int number)
我們可以通過交換參數的順序輕鬆解決這個問題,將varargs
參數放在最後:
static String[] someMethod(int number, String... args)
讓我們測試一下我們上面寫的firstLetterOfWords
方法:
@Test
void whenCheckingReturnedObjectClass_thenClassShouldBeStringArray() {
assertEquals(String[].class, firstLetterOfWords("football", "basketball", "volleyball").getClass());
assertEquals(3, firstLetterOfWords("football", "basketball", "volleyball").length);
}
我們知道firstLetterOfWords()
方法採用String
類型的可變長度參數列表,因為省略號,我們將其作為參數傳遞。測試表明,當我們訪問其getClass()
屬性時,該方法返回一個數組。當我們訪問數組的 length 屬性時,我們也會得到 3,這與傳遞給它的參數數量相匹配。
4. (String[] args)
與(String… args)
String[] args
表示一個String
類型的數組作為Java中的方法參數。它經常作為 Java 類中 main 方法的數組參數出現。 main 方法中的String[]
args
參數從命令行參數形成一個String
數組。使用(String[] args)
調用方法時,必須傳入一個String
數組作為參數。
在定義一個方法時,我們只能有一個變長參數列表。 Varargs
不僅限於java.lang.String
類型。我們可以有其他類型,如(int… args)
、 (double… args)
等。在幕後,Java 獲取調用帶有varargs
的方法時傳遞的所有參數,並從中生成一個數組。但是,我們可以在沒有參數的情況下調用帶有varargs
參數的方法,在這種情況下它將被視為空數組。
請記住,將args
作為變量名只是一種約定——可以使用任何其他合適的名稱。
5.結論
在本教程中,我們檢查了method(String[] args)
和method(String… args)
之間的區別。第一個是帶有String
數組參數的方法,而後者是一個帶有可變長度參數列表 ( varargs
) 的方法。
Varargs
始終作為方法參數列表中的最後一個參數放置,因此一個方法只能聲明一個varargs
參數。
本教程的代碼可以在 GitHub 上找到。