Методы

Метод — это действие или последовательность действий. Все действия записываются в методах. В предыдущих уроках синтаксис (структура написания) методов был скрыт для простоты. Например, код

System.out.println("Welcome!");

приводился к такому виду:

public static void main() {
    System.out.println("Welcome!");
}

Что означает public, static и void — разберём позже. main — это имя метода. Файл можно запустить на выполнение (открыть как программу), только если существует метод main. В скобках перечислены аргументы — это информация, которую метод принимает и обрабатывает.

В файле, который можно запустить на выполнение, метод main должен принимать единственный аргумент — массив строк String[] args. Упустим это из виду, чтобы не разбираться, что такое аргументы и массив и при каких условиях они попадают в программу.

Программист может объявлять собственные методы. Например, объявим метод sayWelcome:

public static void sayWelcome() {
    System.out.println("Welcome!");
}

Объявить метод обозначает описать определённую последовательность действий, т.е. что данный метод будет делать и с какими аргументами работать. Пустые скобки означают, что метод не принимает аргументов, т. е. для работы ему не нужна никакая дополнительная информация. Теперь методом можно воспользоваться — это называется «вызвать метод» и записывается так:

sayWelcome();

sayWelcome — имя вызываемого метода, пустые круглые скобки — список передаваемых аргументов (пустой в данном случае).

Теперь можно переписать программу таким образом:

public static void main() {
    sayWelcome();
}
public static void sayWelcome() {
    System.out.println("Welcome!");
}

Когда файл будет запущен на выполнение, выполнится метод main. Он состоит из одной команды — вызова метода sayWelcome. Следовательно, будет вызван метод sayWelcome, который, в свою очередь, выведет строку «Welcome!» на экран. Схематически можно представить это так:

{"name":"main","subCalls":[{"name":"sayWelcome","subCalls":[{"name":"println(\"Welcome\")","subCalls":[]}]}]}

Можно вызывать метод любое количество раз, например, программа

public static void main() {
    sayWelcome();
    sayWelcome();
    sayWelcome();
}
public static void sayWelcome() {
    System.out.println("Welcome!");
}

выведет на экран

Welcome!
Welcome!
Welcome!

Схематически выполнение можно представить так:

{"name":"main","subCalls":[{"name":"sayWelcome","subCalls":[{"name":"println(\"Welcome!\")","subCalls":[]}]},{"name":"sayWelcome","subCalls":[{"name":"println(\"Welcome!\")","subCalls":[]}]},{"name":"sayWelcome","subCalls":[{"name":"println(\"Welcome!\")","subCalls":[]}]}]}

Программа, трижды выводящая на экран «Welcome!», могла бы выглядеть и так:

public static void main() {
    sayWelcomeThreeTimes();
}
public static void sayWelcomeThreeTimes() {
    System.out.println("Welcome!");
    System.out.println("Welcome!");
    System.out.println("Welcome!");
}

но выполнение программы происходило бы таким образом

{"name":"main","subCalls":[{"name":"sayWelcomeThreeTimes","subCalls":[{"name":"println(\"Welcome!\")","subCalls":[]},{"name":"println(\"Welcome!\")","subCalls":[]},{"name":"println(\"Welcome!\")","subCalls":[]}]}]}

Передача строки-аргумента

Методы были бы довольно бесполезными, если бы не могли принимать информацию.

public static void say(String str) {
    System.out.println(str);
}

Этот метод принимает единственный аргумент — String str. String — это тип аргумента (строка), str — имя локальной переменной, в которой находится значение этого аргумента. Переменная str существует только в пределах тела этого метода. Этот код:

public static void main() {
    sayTwice("Hello!");
}
public static void sayTwice(String str) {
    System.out.println(str);
    System.out.println(str);
}

выведет на экран

Hello!
Hello!

Схематично:

{"name":"main","subCalls":[{"name":"sayTwice(\"Hello!\")","subCalls":[{"name":"println(str)","subCalls":[]},{"name":"println(str)","subCalls":[]}]}]}

Передача целого числа

Разумеется, методы могут принимать числа.

public static void main() {
    sayHowManyPotatoes(34);
}
public static void sayHowManyPotatoes(int count) {
    System.out.println("There are " + count " potatoes.");
}

Выводит на экран:

There are 34 potatoes.

Метод sayHowManyPotatoes принимает целое число и выводит строку, сложенную со значением аргумента (переменной count). Схематически можно представить это так:

{"name":"main","subCalls":[{"name":"sayHowManyPotatoes(34)","subCalls":[{"name":"println(\"There are \" + count + \" potatoes\")","subCalls":[]}]}]}

Передача двух аргументов

public static void main() {
    sayHowMany("potatoes", 34);
    sayHowMany("tomatoes", 19);
}
public static void sayHowMany(String what, int count) {
    // первый вызов: what = potatoes, count = 34
    // второй вызов: what = tomatoes, count = 19
    System.out.println("There are " + count + " " + what + ".");
}

выведет на экран:

There are 34 potatoes.
There are 19 tomatoes.

Схематически:

{"name":"main","subCalls":[{"name":"sayHowMany(\"potatoes\", 34)","subCalls":[{"name":"println(\"There are \" + count + \" \" + what \".\")","subCalls":[]}]},{"name":"sayHowMany(\"tomatoes\", 19)","subCalls":[{"name":"println(\"There are \" + count + \" \" + what \".\")","subCalls":[]}]}]}

Пример с числом и арифметикой

public static void main() {
    saySquareOf(2);
    saySquareOf(9);
    saySquareOf(11);
}
public static void saySquareOf(int n) {
    System.out.println(n*n);
}

Вывод:

4
81
121

Схематически:

{"name":"main","subCalls":[{"name":"saySquareOf(2)","subCalls":[{"name":"println(n*n)","subCalls":[]}]},{"name":"saySquareOf(9)","subCalls":[{"name":"println(n*n)","subCalls":[]}]},{"name":"saySquareOf(11)","subCalls":[{"name":"println(n*n)","subCalls":[]}]}]}
Задачи к уроку Комментарии к уроку

В десять раз больше

Напишите метод sayNumberMultipliedByTen, который принимает аргумент типа double и выводит на экран его значение, умноженное в десять раз.

{{ message.data }}

Текст переданной строки

Напишите метод, который будет принимать строку и выводить такой текст: Передана строка: '<содержимое строки>' с одинарными кавычками ('), без угловых скобок (<, >).

{{ message.data }}

Сообщить об ошибке