Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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数组参数声明语法“quot;”&引用;工作_Java_Arrays_Declaration - Fatal编程技术网

Java数组参数声明语法“quot;”&引用;工作

Java数组参数声明语法“quot;”&引用;工作,java,arrays,declaration,Java,Arrays,Declaration,我编写java已经有一段时间了,今天我遇到了以下声明: public static void main(String... args) { } 注意数组声明中的“点”,而不是通常的括号[]。显然,它是有效的。事实上,我写了一个小测试,并验证了它的工作原理。因此,我拉动java语法查看参数声明的语法在哪里,但没有找到任何东西 那么对于那些专家来说,这是如何工作的呢?这是语法的一部分吗?另外,虽然我可以像这样声明函数,但我不能像这样在函数体中声明数组 不管怎么说,你知道有哪个地方有这样的记录吗。

我编写java已经有一段时间了,今天我遇到了以下声明:

public static void main(String... args) {

}
注意数组声明中的“点”,而不是通常的括号[]。显然,它是有效的。事实上,我写了一个小测试,并验证了它的工作原理。因此,我拉动java语法查看参数声明的语法在哪里,但没有找到任何东西

那么对于那些专家来说,这是如何工作的呢?这是语法的一部分吗?另外,虽然我可以像这样声明函数,但我不能像这样在函数体中声明数组


不管怎么说,你知道有哪个地方有这样的记录吗。这是一种好奇心,也许不值得花时间在它上面,但我被难住了。

它被称为varadic argument:一个可以接受任意多个(包括零个)参数的函数。 例如,
main(“string1”、“string2”、“string3”)
main({“string1”、“string2”、“string3”)
相同,前提是main声明为
void main(String…args)


请参见

这称为可变参数,请检查此处:

官方文档(Java 1.5)如下所示:


我相信这是在Java1.5中实现的。该语法允许您使用逗号分隔的参数列表而不是数组来调用方法

public static void main(String... args);
main("this", "is", "multiple", "strings");
同:

public static void main(String[] args);
main(new String[] {"this", "is", "multiple", "strings"});

请查看。埋在那里的是一块金块:

如果最后一个形式参数是T类型的变量arity参数,则考虑定义T[]类型的形式参数。然后,该方法是一种可变算术方法。否则,它是一种固定的算术方法。变量arity方法的调用可能包含比形式参数更多的实际参数表达式。所有与变量arity参数前面的形式参数不对应的实际参数表达式都将被计算,结果存储到一个数组中,该数组将被传递给方法调用(§15.12.4.2)

基本上,任何方法调用的最后一个参数都可以有
T..
。如果有,则转换为
T[]

所以,基本上,你所拥有的是一种奇特的方式,来复制更传统的东西

String[] args
是的

简单地说,它是
成员的
数组

public setMembers(Member[] members);
何时使用:

通常,在设计API时,最好在参数数量不固定的情况下使用

这方面的标准API示例如下

另请参见


这意味着您可以将零个或多个
Member
对象传递给
setMembers()
方法。在setMembers方法中,
成员将具有数组语义。

您可能需要仔细阅读。

这就是所谓的varargs语法。在方法体中,您可以读取
成员
参数,因为它是一个数组-实际上,它是一个数组

public static void main(String... args);
main("this", "is", "multiple", "strings");
然而,神奇之处在于调用该方法。在引入
varargs
语法之前,您可以这样调用该方法:

setMembers(new Members[] {member1, member2, member3});
但是,使用新的varargs语法,您不再需要显式创建数组,您可以传递:

setMembers(member1, member2, member3);
但是,这意味着
varargs
参数必须是方法中的最后一个参数。因此,不允许出现类似情况:

void setMembers(Member ... members, String memberType);
总结:这是一个语法糖,真的。我不是Java编译器内部工作的专家,但我非常确定调用接受
varargs
参数的方法的方法会被重建为构建给定类型数组的方法。

。可以有0个或多个字符串参数


函数可以以字符串数组的形式访问参数。

这意味着该方法接受数量可变的字符串参数。这些参数被当作一个数组来处理,所以它们是通过下标来访问的,按照它们传递的顺序。

也考虑OK,我想我理解它是:string x=“嗨”字符串y=“u”打印字符串(x,y);public void printString(String…greetings){for(int x=0;xYes,准确地说是“hiyou”。您还可以使用“for(String s:greetins)…”,它看起来更好:)另外,鉴于数组参数和varargs的签名不同,这是如何工作的?