Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,变长参数是否被视为数组?_Java_Arrays_Variadic Functions - Fatal编程技术网

在Java中,变长参数是否被视为数组?

在Java中,变长参数是否被视为数组?,java,arrays,variadic-functions,Java,Arrays,Variadic Functions,据我所知,数组由固定数量的元素组成,可变长度参数接受的参数数量与您传递的参数数量相同(类型相同)。但它们是一样的吗?我能在需要另一个的地方经过吗 是,如果您有一个带有varargs参数的方法,如下所示: public void foo(String... names) foo("x", "y", "z"); 你这样称呼它: public void foo(String... names) foo("x", "y", "z"); 然后编译器将其转换为: foo(new String[] {

据我所知,
数组
由固定数量的元素组成,
可变长度参数
接受的参数数量与您传递的参数数量相同(类型相同)。但它们是一样的吗?我能在需要另一个的地方经过吗

是,如果您有一个带有varargs参数的方法,如下所示:

public void foo(String... names)
foo("x", "y", "z");
你这样称呼它:

public void foo(String... names)
foo("x", "y", "z");
然后编译器将其转换为:

foo(new String[] { "x", "y", "z"});
names
参数的类型是
String[]
,可以像任何其他数组变量一样使用。请注意,它仍然可以是
null

String[] nullNames = null;
foo(nullNames);
有关更多信息,请参阅

这并不意味着varargs可以与数组互换——您仍然需要声明接受varargs的方法。例如,如果您的方法声明为:

public void foo(String[] names)

那么,调用它的第一种方法将无法编译。

一个简单的测试将表明它们是相同的:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}
产出:

string1
string2
string3
string4
string5
string6

它们是相同的,JVM在创建varargs方法时在内部使用数组。因此,您可以用处理数组的相同方式处理vararg参数,因此请使用实例增强for循环

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}
然后像这样调用它,甚至传递一个数组

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});

请参阅此nice以获得进一步解释。

您试过了吗?编写几行Java代码并不需要太多。答案是:是的,您还可以将数组传递给变量参数方法,并将其用作参数列表。但是,不能将变量参数传递给声明为接受数组的方法。@ErwinBolwidt您的注释非常有用。谢谢。正如ErwinBolwidt提到的,我们不能在需要数组的地方传递可变数量的参数。但是,主要的方法呢?我们可以将main声明为main(String…args),对吗?你能澄清一下吗?@Phoenix:是的,你可以-当然,你可以很容易地自己测试。但是Java数组的大小必须是预设的。这会将允许的参数数量限制为该数组的大小。在我看来,变量参数列表必须是ArrayList