Каждая подпрограмма в Java должна быть определена внутри некоторого класса. Это делает Java довольно необычным среди языков программирования, поскольку большинство языков допускают свободно плавающие независимые подпрограммы. Одной из целей класса является группировка связанных подпрограмм и переменных. Возможно, разработчики Java посчитали, что все должно быть с чем-то связано. В качестве менее философской мотивации разработчики Java хотели жестко контролировать способы именования вещей, поскольку программа на Java потенциально имеет доступ к огромному количеству подпрограмм, созданных разными программистами. Тот факт, что эти подпрограммы сгруппированы в именованные классы (а классы сгруппированы в именованные пакеты), помогает избежать путаницы, которая может возникнуть из-за большого количества разных имен.

Подпрограмму, которая является членом класса, часто называют методом, а термин «метод» — это термин, который большинство людей предпочитает для подпрограмм в Java. Я начну время от времени использовать термин «метод»; однако я по-прежнему предпочитаю более общий термин «подпрограмма» для статических подпрограмм. Я буду использовать термин «метод» чаще всего для обозначения нестатических подпрограмм, которые принадлежат объектам, а не классам. В этой главе почти исключительно рассматриваются статические подпрограммы. В следующей главе мы обратимся к нестатическим методам и объектно-ориентированному программированию.

Определения подпрограмм

Определение подпрограммы в Java имеет вид:

‹модификаторы › ‹тип возврата› ‹имя-подпрограммы› ( ‹список-параметров› ) {

}

Нам понадобится некоторое время — большая часть главы — чтобы подробно разобраться, что все это значит. Конечно, вы уже видели примеры подпрограмм в предыдущих главах, такие как процедура main() программы и процедура paint() апплета. Итак, вы знакомы с общим форматом.

‹Утверждения› между фигурными скобками { и } в определении подпрограммы составляют тело подпрограммы. Эти утверждения являются внутренней частью или частью реализации «черного ящика», как обсуждалось в предыдущем разделе. Это инструкции, которые компьютер выполняет при вызове метода. Подпрограммы могут содержать любые операторы, описанные в главах 2 и 3.

‹Модификаторы›, которые могут встречаться в начале определения подпрограммы, — это слова, которые задают определенные характеристики подпрограммы, например, является ли она статической или нет. Модификаторы, которые вы видели до сих пор, являются «статическими» и «общедоступными». Всего существует около полудюжины возможных модификаторов.

Если подпрограмма является функцией, задачей которой является вычисление некоторого значения, то ‹тип возврата› используется для указания типа значения, возвращаемого функцией. Мы рассмотрим функции и возвращаемые типы более подробно в Разделе 4.4. Если подпрограмма не является функцией, то ‹тип возврата› заменяется специальным значением void, указывающим, что значение не возвращается. Термин «void» означает, что возвращаемое значение пусто или не существует.

Наконец, мы подошли к «списку параметров» метода. Параметры являются частью интерфейса подпрограммы. Они представляют собой информацию, которая передается подпрограмме извне для использования во внутренних вычислениях подпрограммы. В качестве конкретного примера представьте класс с именем Television, который включает метод с именем changeChannel(). Непосредственный вопрос: на какой канал он должен переключиться? Для ответа на этот вопрос можно использовать параметр. Поскольку номер канала является целым числом, тип параметра будет int, а объявление метода changeChannel() может выглядеть так:

public void changeChannel(int channelNum) { … }

Это объявление указывает, что changeChannel() имеет параметр с именем channelNum типа int. Однако у channelNum пока нет конкретного значения. Значение для channelNum предоставляется при вызове подпрограммы; например: изменить канал (17);

Список параметров подпрограммы может быть пустым или состоять из одного или нескольких объявлений параметров вида htypei hparameter-namei. Если объявлений несколько, они разделяются запятыми. Обратите внимание, что каждое объявление может называть только один параметр. Например, если вам нужны два параметра типа double, вы должны сказать «double x, double y», а не «double x, y».

Более подробно параметры рассматриваются в следующем разделе.