Навигация
Главная
Поиск
Форум
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
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 58627
Invision Power ... 57657
Организация зап... 57458
Модуль Forms 56517
Создание отчето... 55108
Приложение «Про... 54812
Подключение Mic... 54625
Оператор выбора... 54399
ТЕХНОЛОГИИ ДОСТ... 51162
Программируемая... 47747
Пример работы с... 46919
Имитационное мо... 46868
21 ошибка прогр... 41897
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

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

Обратное размещение элементов ЭВС на Delphi + Пояснительная записка
Моделирование работы крупного аэропорта на GPSS + Пояснительная записка
Диплом RSA, ЭЦП, сертификаты, шифрование на C#

Реклама

Аргументы переменной длины. Средство формирования списка с переменным числом аргументов
До выхода версии 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 Комментариев · 10225 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
INSTANT BOOSTER v...
Дешифратор содерж...
THttpScan v4.1
PDA версия сайта
AddPage [Исходник...
Tenis [Исходник н...
PHP в примерах
Простой текстовый...
Matrix2D
PHP 5 для "чайников"
AlignEdit
Berg
Трассировка прово...
Измерение тактово...
Панель статистики...
Динамические за...
Мод "проверочный ...
Электронный магаз...
Программа для рис...
C++ Builder 6 СПР...

Топ загрузок
Приложение Клие... 100272
Delphi 7 Enterp... 75184
Converter AMR<-... 20017
Borland C++Buil... 10478
GPSS World Stud... 8850
Borland Delphi ... 7481
Turbo Pascal fo... 6868
Visual Studio 2... 4868
Калькулятор [Ис... 3841
FreeSMS v1.3.1 3481
Случайные статьи
Итерации в первой ...
8.1. Задача и прос...
Работа с базами да...
Натяжные потолки
Слияние двух списков
Снятие объектива в...
HTPC на базе Linux
7.8. Использован...
Использование прог...
Эффективное уменьш...
Использование вспы...
Символы, используе...
File variable expe...
Windows Server 200...
Настройка объектов
Двухфазное кодиров...
Цели, стоявшие пер...
Функции Windows
неотрицательность ...
Исправленные симво...
Чем отличается руб...
Процедура PieSlice...
Параметры шаблонов
true
Листинг 11.2. Сорт...
Статистика



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


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