Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65104
Модуль Forms 64885
Пример работы с... 63348
ТЕХНОЛОГИИ ДОСТ... 61582
Имитационное мо... 57447
Реклама
Сейчас на сайте
Гостей: 15
На сайте нет зарегистрированных пользователей

Пользователей: 13,081
новичок: Abdukarimov A
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Принадлежит ли точка пересечению двух окружностей на Turbo Pascal + Отче...
Обработка задач на ЭВМ на GPSS + Пояснительная записка

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Аргументы переменной длины. Средство формирования списка с переменным числом аргументов
До выхода версии Java 2 5.0 переменное количество аргументов обрабатывалось двумя способами, ни один из которых нельзя назвать удобным. Во-первых, если максимальное число аргументов не велико и известно, можно было создать перегружаемые версии метода, по одной на каждый вариант списка передаваемых в метод аргументов. Хотя этот способ работает и подходит для некоторых случаев, он применим лишь к узкому классу задач.
Если максимальное количество аргументов было велико или неизвестно, применялся второй способ: аргументы помещались в массив, и этот массив передавался методу. Этот подход иллюстрирует программа, приведенная в листинге 5.1.

Листинг 5.1. Применение массива для передачи разного количества аргументов методу

// Use an array to pass a variable number of
// arguments to a method. This is the old-style
// approach to variable-length arguments.
class PassArray {
static void vaTest(int v[]) {
System.out.print("Number of args: " + v.length +
" Contents: ");

for(int x : v)
System.out.print(x + " ");

System.out.println();
}

public static void main(String args[])
{
// Notice how an array must be created to
// hold the arguments.
int n1[] = { 10 };
int n2[] = { 1, 2, 3 };
int n3[] = { };

vaTest(n1); // 1 arg
vaTest(n2); // 3 args
vaTest(n3); // no args
}
}



Далее приведен вывод результатов работы программы из листинга 5.1:
Number of args: 1 Contents: 10
Number of args: 3Contents: 1 2 3
Number of args: 0 Contents:



В листинге 5.1 методу vaTest() аргументы передаются в массиве v. Этот устаревший подход, тем не менее, позволяет методу vaTest() принимать произвольное число аргументов. Но при этом необходимо вручную упаковать аргументы в массив перед вызовом метода vaTest(). Кроме того, что формировать массив для каждого вызова vaTest() утомительно, это действие может быть источником ошибок. Новое средство создания списков с произвольным количеством аргументов предлагает более простой и удобный способ.
Аргумент переменной длины (содержащий переменное число аргументов) задается тремя точками (...). В следующей строке приведен пример описания метода vaTest(), использующего аргумент переменной длины:
static void vaTest (int...v) {
Эта синтаксическая запись сообщает компилятору, что vaTest() может вызываться без параметров, с одним или несколькими параметрами. В результате переменная v, аргумент переменной длины, неявно объявляется массивом типа int[ ]. Таким образом, в теле метода vaTest() для доступа к v используется нормальный синтаксис работы с массивом. В листинге 5.2 приведен вариант программы из листинга 5.1, но с применением средства формирования списка с переменным числом аргументов.
Листинг 5.2. Демонстрация средства формирования списка с переменным числом элементов
// vaTest() now uses a vararg.
static void vaTest(int ... v) {
System.out.print("Number of args: " + v.length +
" Contents: ");

for(int x : v)
System.out.print(x + " ");

System.out.println();
}

public static void main(String args[])
{

// Notice how vaTest() can be called with a
// variable number of arguments.
vaTest(10); // 1 arg
vaTest(1, 2, 3); // 3 args
vaTest(); // no args
}
}



Вывод у программы из листинга 5.2 такой же, как у примера из листинга 5.1.
В приведенной программе следует обратить внимание на два момента. Во-первых, как уже упоминалось, внутри метода vaTest() аргумент переменной длины, v, обрабатывается как массив, потому что v и есть массив. Символьная комбинация ... сообщает компилятору о том, что будет использоваться переменное число аргументов, и что эти аргументы будут храниться в массиве, ссылка на который содержится в переменной v. Во-вторых, в методе main() метод vaTest() вызывается с разным числом аргументов, включая полное их отсутствие. Аргументы автоматически помещаются в массив и передаются переменной v. В случае отсутствия аргументов длина массива равна 0.
В список параметров метода могут быть включены "обычные" (обязательно указываемые при вызове метода) параметры наряду параметром переменной длины. При этом параметр, содержащий переменное число аргументов, должен быть последним в списке параметров метода. В следующей строке приведен пример корректного объявления такого метода:
int doIt (int a, int b, double с, int...vals) {
В приведенном примере первые три аргумента, используемые при вызове метода doIt (), соответствуют первым трем параметрам. Любые оставшиеся аргументы будут передаваться в переменной vals.
Запомните: параметр переменной длины (т. е. содержащий произвольное число аргументов) должен быть последним в списке параметров метода. В следующей строке приведен пример некорректного объявления:
Int doIt (int a, int b, double c,int-vals,Boolean stopFlag){//Ошибка!
В приведенной строке делается попытка объявить обычный параметр после параметра переменной длины, что недопустимо.
Следует знать еще об одном ограничении: в списке параметров метода может быть только один параметр переменной длины. В следующей строке тоже приведено неправильное объявление:
int doIt {int a, int b, double с, int…vals, double…morevals) { // Ошибка!
Попытка указать второй параметр переменной длины также недопустима.
В листинге 5.3 приведена переработанная версия метода vaTest(), которая принимает обычный аргумент и аргумент переменной длины.

Листинг 5.3. Использование аргумента переменной длины и обычного аргумента

class VarArgs2 {

// Here, msg is a normal parameter and v is a
// varargs parameter.
static void vaTest(String msg, int ... v) {
System.out.print(msg + v.length +
" Contents: ");

for(int x : v)
System.out.print(x + " ");

System.out.println();
}

public static void main(String args[])
{
vaTest("One vararg: ", 10);
vaTest("Three varargs: ", 1, 2, 3);
vaTest("No varargs: ");
}
}



Далее приведен вывод результатов работы программы из листинга 5.3:
One vararg: I Contents: 10
Three varargs: 3 Contents: 1 2 3
No varargs: 0 contents:



Опубликовал Kest January 13 2009 13:13:08 · 0 Комментариев · 11451 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Разработка интерн...
Blobs [Исходник н...
MP3 Архив v.2.0
IconCut [Исходник...
PrevInst
Учебник для продв...
Microsoft SQL Ser...
Программа для рис...
Пример клиента ФТ...
ЯЗЫК ПРОГРАММИРОВ...
Drag&Drop
Delphi Быстрый Ст...
Программа "AutoRu...
Медиа комбайн
AVIwriter
DragMe [Исходник ...
Сложный калькулятор
Ведение справочны...
Эффект лампы на р...
mp3tag

Топ загрузок
Приложение Клие... 100466
Delphi 7 Enterp... 86648
Converter AMR<-... 20077
GPSS World Stud... 12670
Borland C++Buil... 11760
Borland Delphi ... 8558
Turbo Pascal fo... 7037
Visual Studio 2... 4998
Калькулятор [Ис... 4762
FreeSMS v1.3.1 3541
Случайные статьи
Обеспечение достав...
SeoSolution
Защита изображений...
ActiveSync для сбо...
Сканирование фотог...
ПАМЯТИ В GPSS
Казино
Error in type
Приведем упрощенны...
Удаление элементов...
Меню добавления из...
ДОПУСТИМЫЕ СПОСОБЫ...
Создание шаблона д...
Выделение структур...
Телевидение и Web
Управление доступо...
Работа с форматом ...
DQTABLE (РАЗНОСТНА...
Служба лицензирова...
Использование прог...
Требования делегир...
Лючки в пол под ро...
Работа с объектом ...
Практичность
Размещение прокси-...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?