Javanese Online

Методы

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

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

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

public static void main(String[] args) {
    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(String[] args) {
    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(String[] args) {
    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(String[] args) {
    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() {
    sayTwice("Hello!");
    sayTwice("Goodbye.");
}

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

выведет

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

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

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

public static void main(String[] args) {
    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(String[] args) {
    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(String[] args) {
    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 }}

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

Javanese.Online в GitHub

Чаты и каналы в Telegram

RSS-лента