Как работает синтаксис объявления аргументов массива Java «…»?
Я писал java некоторое время, и сегодня я столкнулся с следующим объявлением:
public static void main(String... args) { }
Обратите внимание на «dot dot dot» в объявлении массива, а не на обычную скобку []. Ясно, что это работает. На самом деле я написал небольшой тест и проверил его работу. Итак, я вытащил java-грамматику, чтобы увидеть, где этот синтаксис объявления аргументации, но ничего не нашел.
Итак, для экспертов, как это работает? Является ли это частью грамматики? Кроме того, хотя я могу объявить такую функцию, я не могу объявить массив внутри тела функции, как это.
- Включена ли новая функция инициализации члена C ++ 11 при объявлении, что списки инициализации устарели?
- Java: определение терминов инициализация, декларация и присвоение
- Можно ли объявить две переменные разных типов в цикле for?
- Инициализация переменных элемента C #; лучшая практика?
- Инициализация нескольких переменных для одного и того же значения в Java
В любом случае, знаете ли вы о каком-либо месте, где это описано. Это любопытство и, возможно, не стоит того времени вкладывать в него, но я был в тупике.
- Почему переменные объявлены с их именем интерфейса в Java?
- Размещение звездочки в объявлениях указателей
- Переопределение разрешено в C, но не на C ++?
- Ошибка компилятора при объявлении переменной внутри условия if и фигурных скобок
- Спиральное правило и «объявление следует за использованием» для синтаксического анализа объявлений C и C ++
- Что означают знаки плюс и минус в Objective C рядом с методом?
- Значение = delete после объявления функции
- Как инициализировать вектор в C ++
Ознакомьтесь с Спецификацией языка Java, Третье издание, Глава 8 (Классы) . Похоронен в этом самородок:
Если последний формальный параметр является переменным параметром arity типа T, считается, что он определяет формальный параметр типа T []. Затем метод является методом переменной arity. В противном случае это фиксированный метод arity. Вызовы метода переменной arity могут содержать более фактические выражения аргументов, чем формальные параметры. Все фактические выражения аргументов, которые не соответствуют формальным параметрам, предшествующим параметру переменной arity, будут оцениваться и результаты будут сохранены в массив, который будет передан вызову метода (§15.12.4.2).
В принципе, последний параметр любого вызова метода может иметь T...
Если он имеет это, он преобразуется в T[]
.
Таким образом, в основном, у вас есть причудливый способ воспроизведения более традиционных
String[] args
Я считаю, что это было реализовано на Java 1.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"});
http://today.java.net/article/2004/04/13/java-tech-using-variable-arguments http://download.oracle.com/javase/1.5.0/docs/guide/language/varargs .html
Это varargs
Проще говоря, его Array
Member
вроде
public setMembers(Member[] members);
Когда использовать:
Вообще при проектировании API полезно использовать, когда количество аргументов не фиксировано.
Пример из стандартного API этого – String.format(String format,Object... args)
Также см
- вар-Arg-из-объектных массивов-против-объекта-массива, пытаясь для понимания-а-SCJP-самопроверку
Это называется переменными аргументами, здесь:
Официальная документация (Java 1.5) находится здесь:
Это так называемый синтаксис varargs. В теле метода вы можете прочитать параметр members
как массив – на самом деле, он / есть / ‘просто’ массив.
Тем не менее, волшебный бит вызывает вызов метода. Прежде чем синтаксис varargs
был введен, вы бы назвали метод немного следующим:
setMembers(new Members[] {member1, member2, member3});
Однако с новым синтаксисом varargs вам не нужно явно создавать массив, и вы можете передать:
setMembers(member1, member2, member3);
Это означает, однако, что аргумент varargs
должен быть последним аргументом в методе. Поэтому подобное недопустимо:
void setMembers(Member ... members, String memberType);
Подводя итог: на самом деле это немного синтаксический сахар. Я не эксперт по внутренней работе компилятора Java, но я уверен, что методы, вызывающие метод, который принимает параметр varargs
, перестраиваются в методы, которые строят массив данного типа.
Возможно, вам захочется ознакомиться с использованием переменных Variable Arguments (или varargs) в Java .
Он называется varadic argument: функция, которая принимает столько (включая нулевые) аргументы, сколько вы хотите. Например, main("string1", "string2", "string3")
совпадает с main({"string1", "string2", "string3"})
если main объявлен как void main(String...args)
,
См. http://www.java-tips.org/blog/java-se/varargs-%E2%80%93-java-50-addition.html.
Это означает, что вы можете передать ноль или более объектов- setMembers()
методу setMembers()
. В методе setMembers members
будут иметь семантику массива.
Переменные аргументы . Может иметь 0 или более аргументов String.
Функция может получить доступ к параметрам в виде массива строк.
Это означает, что метод принимает переменное число аргументов String. Аргументы рассматриваются как массив, поэтому к ним обращаются по индексу в том порядке, в котором они передаются.