Этот синтаксис сообщает компилятору, что метод vaTest может вызываться с указанием произвольного числа аргументов, в том числе и совсем без них. Более того, аргумент v неявно объявляется как массив типа int [ ]. А в теле метода vaTest доступ к аргументу v осуществляется с помощью обычного синтаксиса обращения к массивам.
Ниже приведен весь исходный код примера программы, демонстрирующего метод vaTest в действии. // Демонстрация метода с аргументами переменной длины, class VarArgs { // Метод vaTest с аргументами переменной длины, static void vaTest(int ... v) { System.out.println("Number of args: " + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } public static void main(String args[]) { // Метод vaTest может вызываться с переменным числом аргументов. vaTest(10); // 1 аргумент vaTest(l, 2, 3); // 3 аргумента vaTest; // без аргументов } }
Выполнение этой программы дает следующий результат: Number of args: 1 Contents: arg 0: 10 Number of args: 3 Contents: arg 0: 1 arg 1: 2 arg 2: 3 Number of args: 0 Contents:
В приведенной выше программе обращает на себя внимание следующее. Во-первых, как пояснялось выше, обращение к аргументу v в методе vaTest осуществляется как к массиву. Дело в том, что он действительно является массивом. Многоточие в объявлении этого метода указывает компилятору на использование переменного числа аргументов и на необходимость поместить их в массив v. Во-вторых, при обращении к методу vaTest в методе main указывается разное число аргументов, включая и вызов данного метода вообще без аргументов. Указываемые аргументы автоматически помещаются в массив v. Если же аргументы не указаны, длина этого массива будет равна нулю.
Помимо аргумента переменной длины, в методе можно также указывать и обычные аргументы, но при одном условии: аргумент переменной длины должен быть указан последним. Например, приведенное ниже объявление метода является вполне допустимым, int dolt(int a, int b, double с, int ... vals) {
В данном случае первые три аргумента, передаваемые при вызове метода dolt , будут соответствовать первым трем параметрам. А остальные аргументы будут считаться относящимися к параметру переменной длины vals.
Ниже приведен переработанный вариант метода vaTest , в котором используются как обычные аргументы, так и аргументы переменной длины. // Использование аргументов переменной длины // вместе с обычными аргументами, class VarArgs2 { // Здесь msg - обычный аргумент, // a v - аргумент переменной длины. static void vaTest(String msg, int ... v) { System.out.println(msg + v.length); System.out.println("Contents: ") ; for(int i=0; i < v.length; i++) System.out.println(" arg " + i + ": " + v[i]); System.out.println; } public static void main(String args[]) { vaTest("One vararg: ", 10); vaTest ("Three varargs: ", 1, 2, 3); vaTest("No varargs: "); } }
Выполнение этого фрагмента кода дает следующий результат: One vararg: 1 Contents: arg 0: 10 Three varargs: 3 Contents: arg 0: 1 arg 1: 2 arg 2: 3 No varargs: 0 Contents:
He следует, однако, забывать, что аргумент переменной длины должен быть указан последним. Например, следующее объявление метода недопустимо: int dolt(int a, int b, double с, int ... vals, boolean stopFlag) { // Ошибка!
В данном примере сделана попытка указать обычный аргумент после аргумента переменной длины.
Существует еще одно ограничение, которое следует соблюдать: аргументы переменной длины можно указать в методе только один раз. Например, приведенное ниже объявление метода составлено неверно. int dolt(int a, int b, double с, int ... vals, double ... morevals) { // Ошибка!
Ошибкой в данном случае является попытка указать два разных типа аргументов переменной длины. Перегрузка методов с аргументами переменной длины