Часто метод main() заносят в каждый класс с целью отладки. В этом случае в метод main () включают тесты для проверки работы всех методов класса.
При вызове интерпретатора java можно передать в метод main() несколько аргументов, которые интерпретатор заносит в массив строк. Эти аргументы перечисляются в строке вызова java через пробел сразу после имени класса. Если же аргумент содержит пробелы, надо заключить его в кавычки. Кавычки не будут включены в аргумент, это только ограничители.
Все это легко понять на примере листинга 2.5, в котором записана программа, просто выводящая на консоль аргументы, передаваемые в метод main () при запуске.
class Echo{
public static void main(string[] args){ for (string s: args)
system.out.println("arg = " + s);
}
}
На рис. 2.4 показаны результаты работы этой программы с разными вариантами задания аргументов.
| Рис. 2.4. Вывод параметров командной строки |
Как видите, имя класса не входит в число аргументов. Оно и так известно в методе
main().
Знатокам C/C++
Поскольку в Java имя файла всегда совпадает с именем класса, содержащего метод main (), оно не заносится в args [0]. Вместо параметра argc используется переменная args. length, имеющаяся в каждом массиве. Доступ к переменным среды разрешен не всегда и осуществляется другим способом. Некоторые значения переменных среды можно просмотреть так:
system.getProperties().list(system.out);
Методы с переменным числом аргументов
Как видно из рис. 2.4, при вызове программы из командной строки мы можем задавать ей разное число аргументов. Исполняющая система Java создает массив этих аргументов и передает его методу main(). Такую же конструкцию можно сделать в своей программе:
class VarArgs{
private static int[] argsl = {1, 2, 3, 4, 5, 6};
private static int[] args2 = {100, 90, 80, 70};
public static int sum(int[] args){ int result = 0;
for (int k: args) result += k; return result;
}
public static void main(string[] args){
System.out.println("Sum1 = " + sum(args1));
System.out.println("Sum2 = " + sum(args2));
}
}
Начиная с пятой версии Java эту конструкцию упростили. Теперь нет необходимости заранее формировать массив аргументов, это сделает компилятор. Программисту достаточно записать в списке параметров метода три точки подряд после имени параметра вместо квадратных скобок, обозначающих массив.
public static int sum(int... args){ int result = 0;
for (int k: args) result += k; return result;
}
При обращении к методу мы просто записываем нужное число аргументов через запятую.
public static void main(string[] args){
System.out.println("Sum1 = " + sum(1, 2, 3, 4, 5, 6));
System.out.println("Sum2 = " + sum(100, 90, 80, 70));
}
Где видны переменные
В языке Java нестатические переменные разрешено объявлять в любом месте кода между операторами. Статические переменные могут быть только полями класса, а значит, не должны объявляться внутри методов и блоков. Какова же область видимости (scope) переменных? Из каких методов мы можем обратиться к той или иной переменной? В каких операторах использовать? Рассмотрим на примере листинга 2.6 разные случаи объявления переменных.
Листинг 2.6. Видимость и инициализация переменных
class ManyVariables{
static int x = 9, y; // Статические переменные — поля класса.
// Они известны во всех методах и блоках класса. // Поле y получает значение 0.
static{ // Блок инициализации статических переменных.
// Выполняется один раз при первой загрузке класса // после инициализаций в объявлениях переменных. x = 99; // Этот оператор выполняется в блоке вне всякого метода!
int a = 1, p; // Нестатические переменные — поля экземпляра.
// Известны во всех методах и блоках класса,
// в которых они не перекрыты другими переменными // с тем же именем.
// Поле p получает значение 0.
{ // Блок инициализации экземпляра.
// Выполняется при создании каждого экземпляра // после инициализаций при объявлениях переменных. p = 999; // Этот оператор выполняется в блоке вне всякого метода!
}
static void f(int b){ // Параметр метода b — локальная переменная,
// известная только внутри метода. int a = 2; // Это вторая переменная с тем же именем "a".
// Она известна только внутри метода f()
// и здесь перекрывает первую "a".
int c; // Локальная переменная, известна только в методе f().
// Не получает никакого начального значения // и должна быть определена перед применением.