Java中的可变参数与数组输入参数

2023/06/09

一、概述

在本教程中,我们将探讨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 中也称为可变参数,允许我们在方法调用期间传递任意数量的相同类型的参数。

方法中可变长度参数列表的语法如下所示:

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 将给定的参数作为数组中的元素来处理。添加可变参数作为方法参数的一部分时,请确保类型、省略号和参数名称位于最后。

例如,这是不正确的:

static String[] someMethod(String... args, int number)复制

我们可以通过交换参数的顺序轻松解决这个问题,将 可变 参数放在最后:

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 获取调用带有可变参数的方法时传递的所有参数,并从中生成一个数组。但是,我们可以在没有参数的情况下调用带有可变参数参数的方法,在这种情况下它将被视为空数组。

请记住,将*args*作为变量名只是一种约定——可以使用任何其他合适的名称。

5.结论

在本教程中,我们检查了method(String[] args)method(String… args)之间的区别。第一个是带有String数组参数的方法,而后者是一个带有可变长度参数列表 ( varargs ) 的方法。

可变参数始终作为方法参数列表中的最后一个参数放置,因此一个方法只能声明一个可变参数参数。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章