Java: Методы и их вызов
Программирование нужно для того, чтобы выполнять самые разные операции. Иногда это простые действия, например сложение чисел или объединение строк. Но чаще это сложные процессы вроде перевода денег со счета на счет, оформления заказа в интернет-магазине, расчета налогов или подготовки отчета.
Такие операции невозможно выразить одной командой. За действием вроде "перевести деньги" скрываются десятки, сотни и даже тысячи строк кода. Это проверка баланса, списание суммы, учет комиссии, обновление базы данных, отправка уведомления пользователю.
Чтобы управлять этим кодом и не теряться в деталях, в программировании придумали специальный механизм. Он объединяет блок кода в единое целое, прячет реализацию и позволяет сосредоточиться на смысле. Для программиста достаточно вызвать его и доверить ему всю внутреннюю работу.
Как выражаются операции
Для выражения произвольной операции в большинстве языков программирования используют функции. Функция объединяет блок кода под одним именем. Снаружи все выглядит как одна команда, а сотни строк внутри остаются скрытыми.
Здесь нужно сделать оговорку. В Java невозможно создать обычную функцию, как это позволяет большинство других языков. Все функции в Java создаются только внутри классов, которые мы пока не разбирали. Функции, определенные внутри классов, принято называть методами. Дальше мы будем придерживаться этой терминологии.
С одним методом мы уже знакомы — это println(). Он выводит данные на экран. Методы — одна из ключевых конструкций в программировании, без них не сделать почти ничего. Сначала мы научимся пользоваться готовыми методами, а уже потом создавать свои собственные.
Начнем с методов для работы со строками. Ниже вызов метода length(), который считает количество символов в строке:
"Hexlet".length(); // 6
"ABBA".length(); // 4В первой строке шесть символов, поэтому "Hexlet".length() вернет 6. Во второй строке четыре символа, и результат равен 4.
Методы — это действия, которые выполняются над данными. В программировании объектами называют данные, у которых есть методы. В реальности все чуть сложнее, но пока такого определения достаточно. В Java все не примитивные (ссылочные) типы данных — это объекты, и строки относятся к ним.
Посмотрим на структуру вызова. Сначала пишется сам объект, затем точка, потом имя метода и круглые скобки. Точка показывает, что метод вызывается у конкретного объекта. Скобки показывают, что это именно вызов, а не обращение к данным.
Внутри скобок указываются аргументы, то есть данные, которые метод получает для работы. Их может быть несколько, один или вовсе ни одного. У метода length() аргументов нет, поэтому скобки пустые.
Откуда берутся методы
Одни методы встроены в язык, другие создают сами программисты.
Встроенные методы идут вместе с Java. Их можно использовать сразу, без дополнительных действий. Пример такого метода — length() у строки. Большое количество методов доступно у строк, чисел и других типов данных прямо из коробки.
Методы, которые создают программисты, появляются тогда, когда нужно оформить свою логику в отдельный блок. Такой метод можно назвать любым именем и вызывать так же, как встроенный. Мы научимся этому позже.
Кроме того, существуют методы из внешних библиотек. Чтобы ими пользоваться, библиотеку подключают с помощью механизма импорта. Подробно импорт мы пока не разбираем. Достаточно знать, что он добавляет в программу набор готовых методов.
Метод без аргументов
Одним из часто используемых строковых методов является length(). Для строки он возвращает количество символов.
var message = "Hello!";
var count = message.length();
System.out.println(count); // => 6Здесь в строке "Hello!" шесть символов, поэтому вызов message.length() вернет число 6.
Объект Метод Результат
┌──────────┐ ┌──────────┐ ┌──────────┐
│ "Hello!" │ ──→ │ length() │ ──→ │ 6 │
└──────────┘ └──────────┘ └──────────┘Возврат значения
Возврат значения — один из ключевых принципов работы методов. Благодаря ему мы соединяем результаты разных действий и строим более сложную логику. Если метод возвращает значение, то его можно сохранить в переменную, передать в другой метод или использовать в вычислениях. Именно так работает length(). Он считает количество символов и отдает результат наружу.
var message1 = "Hello!";
var length1 = message1.length(); // сохраняем результат
var message2 = "World!";
var length2 = message2.length();
// используем результат в выражении
var combinedLength = length1 + length2;
System.out.println(combinedLength); // 12Методы почти никогда не выводят данные на экран, они их возвращают. Если бы length() сразу печатал результат, как делает println(), то мы бы увидели число, но не смогли бы его использовать дальше. Вот почему возврат значения настолько важен. Он связывает методы между собой. Одни возвращают данные, другие используют их в своей работе. Именно так из маленьких шагов строятся большие и сложные программы.
В примерах выше результат каждого вызова записывается в переменную. Но это не обязательно, метод можно использовать напрямую:
var message = "Hexlet";
System.out.println(message.length()); // => 6Метод с аргументами
Некоторые методы принимают сразу несколько данных для работы. Пример — статический метод Math.max(), который возвращает большее из двух чисел. Первый аргумент задает одно число, второй задает другое.
// Выбираем большее из 2 и 3
var result = Math.max(2, 3);
System.out.println(result); // => 3
// Выбираем большее из 10 и 7
System.out.println(Math.max(10, 7)); // => 10Здесь метод вызывается не у строки, а у класса Math через точку. Такие методы называют статическими, они принадлежат самому классу. По структуре вызов с несколькими аргументами не отличается от вызова без них. Те же имя метода, скобки и аргументы через запятую внутри.
Параметры и аргументы
В разговорах о методах то и дело встречаются слова параметры и аргументы. Они связаны между собой, но обозначают разное.
О параметрах говорят при создании метода. Параметром называют переменную внутри метода, в которую попадает переданное значение. Об аргументах говорят при вызове. Аргументом называют то, что мы передаем в метод. Это число, переменная или любое выражение.
// числа в качестве аргументов
System.out.println(Math.max(2, 3)); // => 3
var x = 2;
// аргумент может быть выражением, оно вычислится до передачи в метод
System.out.println(Math.max(x + 1, 3)); // => 3Запоминать это не обязательно, но пригодится при чтении англоязычной литературы.
Постепенно мы будем знакомиться со все большим количеством встроенных методов. Этих методов настолько много, что запомнить их невозможно. Хорошая новость в том, что это и не требуется. Никто не помнит названий методов наизусть. Главное — примерно представлять, что нужно, а дальше помогут подсказки редактора, документация и поиск. Программисты постоянно сидят в документации, разбираясь с тем, как что работает.
Задание
В коде программы определены две переменные, содержащие имена компаний. Посчитайте их общую длину в символах и выведите ее на экран.
Java: Методы и их вызов
Программирование нужно для того, чтобы выполнять самые разные операции. Иногда это простые действия, например сложение чисел или объединение строк. Но чаще это сложные процессы вроде перевода денег со счета на счет, оформления заказа в интернет-магазине, расчета налогов или подготовки отчета.
Такие операции невозможно выразить одной командой. За действием вроде "перевести деньги" скрываются десятки, сотни и даже тысячи строк кода. Это проверка баланса, списание суммы, учет комиссии, обновление базы данных, отправка уведомления пользователю.
Чтобы управлять этим кодом и не теряться в деталях, в программировании придумали специальный механизм. Он объединяет блок кода в единое целое, прячет реализацию и позволяет сосредоточиться на смысле. Для программиста достаточно вызвать его и доверить ему всю внутреннюю работу.
Как выражаются операции
Для выражения произвольной операции в большинстве языков программирования используют функции. Функция объединяет блок кода под одним именем. Снаружи все выглядит как одна команда, а сотни строк внутри остаются скрытыми.
Здесь нужно сделать оговорку. В Java невозможно создать обычную функцию, как это позволяет большинство других языков. Все функции в Java создаются только внутри классов, которые мы пока не разбирали. Функции, определенные внутри классов, принято называть методами. Дальше мы будем придерживаться этой терминологии.
С одним методом мы уже знакомы — это println(). Он выводит данные на экран. Методы — одна из ключевых конструкций в программировании, без них не сделать почти ничего. Сначала мы научимся пользоваться готовыми методами, а уже потом создавать свои собственные.
Начнем с методов для работы со строками. Ниже вызов метода length(), который считает количество символов в строке:
"Hexlet".length(); // 6
"ABBA".length(); // 4В первой строке шесть символов, поэтому "Hexlet".length() вернет 6. Во второй строке четыре символа, и результат равен 4.
Методы — это действия, которые выполняются над данными. В программировании объектами называют данные, у которых есть методы. В реальности все чуть сложнее, но пока такого определения достаточно. В Java все не примитивные (ссылочные) типы данных — это объекты, и строки относятся к ним.
Посмотрим на структуру вызова. Сначала пишется сам объект, затем точка, потом имя метода и круглые скобки. Точка показывает, что метод вызывается у конкретного объекта. Скобки показывают, что это именно вызов, а не обращение к данным.
Внутри скобок указываются аргументы, то есть данные, которые метод получает для работы. Их может быть несколько, один или вовсе ни одного. У метода length() аргументов нет, поэтому скобки пустые.
Откуда берутся методы
Одни методы встроены в язык, другие создают сами программисты.
Встроенные методы идут вместе с Java. Их можно использовать сразу, без дополнительных действий. Пример такого метода — length() у строки. Большое количество методов доступно у строк, чисел и других типов данных прямо из коробки.
Методы, которые создают программисты, появляются тогда, когда нужно оформить свою логику в отдельный блок. Такой метод можно назвать любым именем и вызывать так же, как встроенный. Мы научимся этому позже.
Кроме того, существуют методы из внешних библиотек. Чтобы ими пользоваться, библиотеку подключают с помощью механизма импорта. Подробно импорт мы пока не разбираем. Достаточно знать, что он добавляет в программу набор готовых методов.
Метод без аргументов
Одним из часто используемых строковых методов является length(). Для строки он возвращает количество символов.
var message = "Hello!";
var count = message.length();
System.out.println(count); // => 6Здесь в строке "Hello!" шесть символов, поэтому вызов message.length() вернет число 6.
Объект Метод Результат
┌──────────┐ ┌──────────┐ ┌──────────┐
│ "Hello!" │ ──→ │ length() │ ──→ │ 6 │
└──────────┘ └──────────┘ └──────────┘Возврат значения
Возврат значения — один из ключевых принципов работы методов. Благодаря ему мы соединяем результаты разных действий и строим более сложную логику. Если метод возвращает значение, то его можно сохранить в переменную, передать в другой метод или использовать в вычислениях. Именно так работает length(). Он считает количество символов и отдает результат наружу.
var message1 = "Hello!";
var length1 = message1.length(); // сохраняем результат
var message2 = "World!";
var length2 = message2.length();
// используем результат в выражении
var combinedLength = length1 + length2;
System.out.println(combinedLength); // 12Методы почти никогда не выводят данные на экран, они их возвращают. Если бы length() сразу печатал результат, как делает println(), то мы бы увидели число, но не смогли бы его использовать дальше. Вот почему возврат значения настолько важен. Он связывает методы между собой. Одни возвращают данные, другие используют их в своей работе. Именно так из маленьких шагов строятся большие и сложные программы.
В примерах выше результат каждого вызова записывается в переменную. Но это не обязательно, метод можно использовать напрямую:
var message = "Hexlet";
System.out.println(message.length()); // => 6Метод с аргументами
Некоторые методы принимают сразу несколько данных для работы. Пример — статический метод Math.max(), который возвращает большее из двух чисел. Первый аргумент задает одно число, второй задает другое.
// Выбираем большее из 2 и 3
var result = Math.max(2, 3);
System.out.println(result); // => 3
// Выбираем большее из 10 и 7
System.out.println(Math.max(10, 7)); // => 10Здесь метод вызывается не у строки, а у класса Math через точку. Такие методы называют статическими, они принадлежат самому классу. По структуре вызов с несколькими аргументами не отличается от вызова без них. Те же имя метода, скобки и аргументы через запятую внутри.
Параметры и аргументы
В разговорах о методах то и дело встречаются слова параметры и аргументы. Они связаны между собой, но обозначают разное.
О параметрах говорят при создании метода. Параметром называют переменную внутри метода, в которую попадает переданное значение. Об аргументах говорят при вызове. Аргументом называют то, что мы передаем в метод. Это число, переменная или любое выражение.
// числа в качестве аргументов
System.out.println(Math.max(2, 3)); // => 3
var x = 2;
// аргумент может быть выражением, оно вычислится до передачи в метод
System.out.println(Math.max(x + 1, 3)); // => 3Запоминать это не обязательно, но пригодится при чтении англоязычной литературы.
Постепенно мы будем знакомиться со все большим количеством встроенных методов. Этих методов настолько много, что запомнить их невозможно. Хорошая новость в том, что это и не требуется. Никто не помнит названий методов наизусть. Главное — примерно представлять, что нужно, а дальше помогут подсказки редактора, документация и поиск. Программисты постоянно сидят в документации, разбираясь с тем, как что работает.
Задание
В коде программы определены две переменные, содержащие имена компаний. Посчитайте их общую длину в символах и выведите ее на экран.
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "12";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
