2014-02-13 48 views
4

我最近对Java中的这种特性感兴趣,因为函数的参数数量是可变的。这是一个非常酷的功能。但我感兴趣的是:JVM如何实现可变参数?

void method(int x, String.. args) { 
    // Do something 
} 

这是如何在实际运行时级别执行?是什么在我脑海中,就是当我们有一个电话:

method(4, "Hello", "World!"); 

最后两个参数是内部改造成一个阵列,传递给方法。我对此是否正确,或者JVM实际上将堆栈引用推入字符串,而不仅仅是对数组的引用?

回答

6

它在编译时级别实现。你方法编译成字节码

varargs method(I[Ljava/lang/String;)V 
... 

这相当于

void method(int x, String[] args) { 
... 

varargs标志。

而且

method(4, "Hello", "World!"); 

被编译为

method(4, new String[] {"Hello", "World!"}); 
3

这样的方法被转化成

void method(int x, String[] args) { 
} 

及其呼叫

method(4, "Hello", "World!"); 

被转换成

method(4, new String[]{"Hello", "World!"}); 

注意,最后一个调用可以直接写入。重写可变参数的方法时,这是有用的:

@Override 
void method(int x, String... args) { 
    String[] newArgs=new String[]; 
    ... // fill new args; then 
    super.method(newArgs); 
} 
2

最后两个参数在内部变换成一个阵列,传递给该方法。我是对的,

是的,你的理解是正确的。一个数组构造并作为参数传递。

为了确保如果你看到那个调用的字节代码,你可以在那里看到数组。数组创建并传递到目标。