我最近对Java中的这种功能感兴趣,作为具有可变数量参数的函数。这是一个非常酷的功能。但我很感兴趣:
void method(int x, String.. args) {
// Do something
}
这是如何在运行时级别实际实现的?我想到的是,当我们打电话时:
method(4, "Hello", "World!");
最后两个参数在内部转换为数组,并传递给方法。我对此是正确的,或者JVM实际上是在堆栈中引用字符串,而不仅仅是对数组的一个引用?
答案 0 :(得分:10)
它在编译时实现。您将方法编译为字节码
varargs method(I[Ljava/lang/String;)V
...
相当于
void method(int x, String[] args) {
...
带有varargs
标志的。
并且
method(4, "Hello", "World!");
编译为
method(4, new String[] {"Hello", "World!"});
答案 1 :(得分:3)
这种方法转换为
void method(int x, String[] args) {
}
及其电话
method(4, "Hello", "World!");
转换为
method(4, new String[]{"Hello", "World!"});
请注意,最后一次通话可以直接写入。这在覆盖vararg方法时很有用:
@Override
void method(int x, String... args) {
String[] newArgs=new String[];
... // fill new args; then
super.method(newArgs);
}
答案 2 :(得分:2)
最后两个参数在内部转换为数组,并传递给方法。我是对的,
是,您的理解是正确的。数组构造并作为参数传递。
要确保如果看到该调用的字节代码,则可以在那里看到该数组。数组创建并传递到目标。