2012-01-06 6 views
4

Если я использую многоточие в основном методе, это имеет значение?Использование многоточия в основном методе?

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

} 
+1

Вы попробовали? –

+0

да .. это сработало .. но я просто хочу знать .. это тоже действительный подход ..? – Harinder

+0

Nat Pryce берет на себя следующее: http://natpryce.com/articles/000708.html –

ответ

6

Без разницы. Этот синтаксис «эллипсис» называется varargs, тип параметра которого фактически является массивом.

Это означает, что есть на самом деле три возможных подписи действительного main() метода:

public static void main(String[] args) {} 
public static void main(String... args) {} 
public static void main(String args[]) {} 
+0

thnks для устранения моего сомнения .. :) – Harinder

+1

И причина в том, что компилятор интерпретирует 'T ...' как 'T [] '. – zeller

+0

aww ... thks david .. – Harinder

3

Он не делает никакой разницы, так как виртуальная машина поворачивает многоточие (также называется «переменной длиной») в массив в "компиляции" время:

void myMethod(final X... args) 

точно так же, как

void myMethod(final X[] args) 

или (реже)

void myMethod(final X args[]) 
+2

Я уверен, что 'X []' более распространен, чем 'args []' и, на мой взгляд, также сильно предпочтителен ('args' - это тип' X [] ', а не' X'). Вы уверены, что поставили последние два в правильном порядке? –

+0

Да, действительно. Исправлена. – fge

1

Это то же самое. Учитывая следующие файлы классов:

$ cat MainEllipsis.java 
public class MainEllipsis { 
    public static void main(String... args) {} 
} 

$ cat MainArray.java 
public class MainArray { 
    public static void main(String[] args) {} 
} 

После компиляции (javac MainEllipsis.java MainArray.java), мы можем проверить скомпилированные подписи с помощью javap -s <class>:

> javap -s MainEllipsis 
<...snip...> 
    public static void main(java.lang.String...); 
    descriptor: ([Ljava/lang/String;)V 

и

> javap -s MainArray 
<...snip...> 
    public static void main(java.lang.String[]); 
    descriptor: ([Ljava/lang/String;)V 

[Ljava/lang/String; представляет String[] тип, показывающий что сгенерированные сигнатуры метода одинаковы.

0

Помимо того, что другие упомянули, я думаю, что это может быть полезно для написания модульных тестов вашего метода main().

Смежные вопросы