Методы с переменным числом параметров Java

Возможность передачи в метод нефиксированного числа параметров позволяет отказаться от предварительного создания массива объектов для его последующей передачи в метод.

/* пример # 14: определение количества параметров метода: DemoVarargs.java */

package chapt03;

public class DemoVarargs {

public static int getArgCount(Integer… args) {

if (args.length == 0)

System.out.print("No arg=");

for (int i : args)

System.out.print("arg:" + i + " ");

return args.length;

}

public static void main(String args[]) {

System.out.println("N=" + getArgCount(7, 71, 555));

Integer[] i = { 1, 2, 3, 4, 5, 6, 7 };

System.out.println("N=" + getArgCount(i));

System.out.println(getArgCount());

}

}

В результате выполнения этой программы будет выведено:

arg:7 arg:71 arg:555 N=3

arg:1 arg:2 arg:3 arg:4 arg:5 arg:6 arg:7 N=7

No arg=0

В примере приведен простейший метод с переменным числом параметров. Метод getArgCount() выводит все переданные ему аргументы и возвращает их количество. При передаче параметров в метод из них автоматически создается массив. Второй вызов метода в примере позволяет передать в метод массив. Метод может быть вызван и без аргументов.

Чтобы передать несколько массивов в метод по ссылке, следует использовать следующее объявление:

void methodName(Тип[]… args){}

Методы с переменным числом аргументов могут быть перегружены:

void methodName(Integer…args) {}

void methodName(int x1, int x2) {}

void methodName(Stringargs) {}

В следующем примере приведены три перегруженных метода и несколько вариантов их вызова. Отличительной чертой является возможность метода с аргументом Objectargs принимать не только объекты, но и массивы:

/* пример # 15 : передача массивов: DemoOverload.java */

package chapt03;

public class DemoOverload {

public static void printArgCount(Object… args) {//1

System.out.println("Object args: " + args.length);

}

public static void printArgCount(Integer[]…args){//2

System.out.println("Integer[] args: " + args.length);

}

public static void printArgCount(int… args) {//3

System.out.print("int args: " + +args.length);

}

public static void main(String[] args) {

Integer[] i = { 1, 2, 3, 4, 5 };

printArgCount(7, "No", true, null);

printArgCount(i, i, i);

printArgCount(i, 4, 71);

printArgCount(i);//будет вызван метод 1

printArgCount(5, 7);

// printArgCount();//неопределенность!

}

}

В результате будет выведено:

Object args: 4

Integer[] args: 3

Object args: 3

Object args: 5

int args: 2

При передаче в метод printArgCount() единичного массива i компи­лятор отдает предпочтение методу с параметром Objectargs, так как имя массива является объектной ссылкой и потому указанный параметр будет ближайшим. Метод с параметром Integer[]…args не вызывается, так как ближайшей объектной ссылкой для него будет Object[]…args. Метод с параметром Integer[]…args будет вызван для единичного массива только в случае отсутствия метода с параметром Objectargs.

При вызове метода без параметров возникает неопределенность из-за невозможности однозначного выбора.

Не существует также ограничений и на переопределение подобных методов.

Единственным ограничением является то, что параметр вида
Тип…args должен быть последним в объявлении метода, например:

void methodName(Тип1 obj, Тип2… args) {}

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100