2010-02-04 6 views
17

У меня есть вопрос о синтаксисе декларации Java main:Почему в Java не используется список аргументов переменной длины?

public static void main (String[] args) 

Так как вы можете передать переменное количество строк при вызове главной функции, не должно это быть переменной длины список аргументов, а не массив? Почему вызов командной строки этого метода со списком строковых параметров даже работает? (Если нет обработки за кадром, которая строит массив со списком строк, а затем передает этот массив основному методу ...?) Не должно ли главное объявление быть чем-то более похожим на это ...? -

public static void main(String... args) 
+3

Я предполагаю, что это обратная проблема совместимости ... –

+0

Я действительно не думаю, что вы должны называть главную функцию самостоятельно ... Она предназначена для вызова из виртуальной машины. –

+1

Я сам не называю главную функцию. Я не думал, что это возможно. Я думаю, это был действительно вопрос о внутренней работе Java ... – froadie

ответ

31

main(String... args) и main (String[] args) эффективно то же самое: То, что вы получаете это String массив. Varargs - это просто синтаксический сахар для вызывающего.

Я думаю, как вы никогда не звоните main() из кода, он не был модифицирован, когда были введены varargs.

Редактировать: Собственно, поцарапайте последнее предложение. main(String... args) - вполне допустимый синтаксис, конечно. Эти два стиля полностью взаимозаменяемы. Это очень хорошо работает:

public class Test { 

    public static void main(String... args) { 
     System.out.println("Hello World"); 
    } 

} 
+4

Итак, когда вы запускаете программу из командной строки, вы фактически не являетесь непосредственно вызов главного? Есть какая-то обработка, которая происходит до того, как выполняется main? (т. е. построение массива из переданных строк) – froadie

+0

Они не одинаковы. Нельзя вызывать 'main (String [] args)' as 'main (" aaaa ")'. – fastcodejava

+3

Вы не используете метод main(), используя Java. Время выполнения вызывает его для вас. –

9

Основной метод был разработан для Java 1.0.

«...» синтаксис был введен в Java 1.5

Это осуществляется через массив типа вы определили (мое предположение, но ... если Java 1.4 и 1.5 байтовые коды совместимы поэтому должны быть реализованы с помощью массивов).

1

Основной синтаксис java предшествует varargs, которые были введены только в java 1.5.

0

Ну, второй синтаксис просто изменение 1-го и да, это было бы хорошо, но он не встроен в Java на данный момент

-2

Почему вы заботитесь? Никто не называет главный метод вручную. Он является внутренним для Java.

EDIT: Я предполагаю, что это не имеет значения теперь, как вы можете определить основной метод, как:

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

Моя точка остается в силе, как никто не называет основной явно.

+1

Не имеет значения, как я кодирую. Меня просто интересовало. – froadie

+0

, если вы не вызываете основной метод другого класса из вашего текущего класса ... В конце концов, вы можете сделать это. –

+3

Я называю «main()» явно - теория уничтожена – Pointy

5

Существует основной метод в настоящее время нет в Java, на самом деле вы можете объявить массив как vararg в основного метода:

public static void main(String... args) { System.out.println("Hi!"); } 
+1

Интересно. Судя по другим ответам/комментариям, я предполагаю, что этот новый синтаксис основной декларации был добавлен с помощью Java 1.5. Таким образом, среда выполнения Java определяет, основываясь на вашем объявлении основного метода, перенести ли строки непосредственно в основной или построить массив в первую очередь? – froadie

+5

Varargs были введены в Java 5 как синтаксический сахар для массивов, то есть они скрывают фактический массив, но под ним это одно и то же, поэтому это и работает. См. Также http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html –

+0

Нет. Он всегда создает массив. Это просто другой синтаксис для выражения одного и того же базового кода. Java все равно будет разбирать аргументы командной строки в массив строк, загружать ссылочный класс, находить его основным методом и называть его аргументами. – Yuliy

1

Не следует основной декларации быть что-то больше похоже это...?

public static void main(String... args) 

На самом деле, это может быть сделано без проблем.

Это было String [] args до появления var args, но в настоящее время оба работают.

15

Вы можете объявить главное в любом случае, и он работает отлично. Проблем «обратной совместимости» или «переоснащения» нет. Тем не менее, читатели вашего кода могут отвлекать внимание, и это вряд ли улучшит вашу программу.

The Java Language Specification (third edition) section 8.4.1 говорит, что «Если последний формальный параметр является переменным параметром арностью типа T, считается определить формальный параметр типа T []».

Спецификация запуска программы Java находится в JLS 12.2, которая ссылается на главу 5 спецификации VM. В VM spec section 5.2 говорится, что виртуальная машина вызывает метод открытого класса «void main(String[])». Поскольку спецификация VM не имеет понятия переменной arity, основная функция, объявленная с использованием «...», удовлетворяет требованию.