Создание (определение) функции

Пора научиться создавать собственные функции! Код, в котором создаётся функция, называется определением функции.

Вот простейший пример функции, которая печатает в консоль ‘“Hello world!”‘ (напомним, это побочный эффект):

static void sayHello() {
  System.out.print("Hello world!");
}

Функции могут возвращать или не возвращать значения, могут вызываться с указанием параметров или без. Тип возвращаемых данных указывают при объявлении функции — перед её именем.

В примере выше функция просто печатает в консоль и ничего не должна возвращать, поэтому тип возвращаемого значения — void.

В заголовке функции сначала идут модификаторы, определяющие, на каких условиях она доступна для вызова. static означает, что функция не пользуется членами того класса, к которому относится (напомним, в Java всякая функция относится к какому-то классу, но классы мы в этом курсе не изучаем).

Чтобы Java-приложение могло работать, в каком-то его классе обязательно нужно объявить такую функцию main, как мы делали ранее во всех примерах:

public static void main(String[] args) {

}

Именно эта функция и будет вызвана при запуске приложения, поэтому в ней мы и писали код, который хотели выполнить. В примерах мы объявляли эту функцию в классе App.

Создадим нашу первую функцию. У неё будет одна задача: выводить на экран текст Today is: December 5.

Нужно назвать функцию так, чтобы из названия была понятна её задача. Давайте дадим ей имя showDate:

static void showDate() {
  var text = "Today is: December 5";
  System.out.print(text);
}

В нашей функции только две строчки кода, но их может быть сколько угодно. Функции можно считать программами внутри программ.

Вот полная программа, c определением функции и вызовом:

public class App {
  public static void main(String[] args) {
    App.showDate();
  }

  static void showDate() {
    var text = "Today is: December 5";
    System.out.print(text);
  }
}

В ней не только функция main, но и showDate описана в классе App, поэтому функция showDate вызывается выражением App.showDate - но на самом деле если обе функции описаны в одном и том же классе, как здесь, то одна из них может вызывать другую без указания имени класса: не App.showDate(), а просто showDate().

Today is: December 5

Мы могли бы использовать подобную функцию на сайте или в какой-нибудь программе, чтобы выводить текущую дату на экран. Но в текущем виде функция не справится с задачей, ведь она всегда выводит Today is: December 5.

Давайте улучшим функцию так, чтобы она принимала дату в качестве аргумента и выводила её на экран.

Определим и вызовем нашу обновленную функцию:

public static void main(String[] args) {
  showDate("January 29");
}

static void showDate(String date) {
  var text = "Today is: " + date;
  System.out.print(text);
}
Today is: January 29

Теперь понятно, зачем нужны были круглые скобки после имени функции: в них можно указать аргументы. Теперь наша функция принимает один аргумент — date, имеющий тип String (так называется в Java тип, соответствующий строке текста).

Заметьте: мы не создаём переменную date, но используем её в теле функции. Java работает так: переменная сама создаётся при вызове и указанное значение (в нашем примере — 'January 29') записывается в эту переменную.

Аргументы можно называть как угодно, их имена имеют смысл исключительно в теле функции.


Аргументов может быть несколько. В таком случае в определении функции мы делаем то же самое, что в вызове: просто указываем аргументы через запятую.

Полный пример определения функции с несколькими аргументами и её вызова:

public static void main(String[] args) {
  showDate("January", "29");
}

static void showDate(String month, String day) {
  var text = "Today is: " + month + " " + day;
  System.out.print(text);
}
Today is: January 29

Главное — помнить про порядок: в каком порядке аргументы стоят при определении функции, в таком же порядке они должны передаваться при вызове.

Задание

Реализуйте функцию printJaimesLine, которая принимает один аргумент — строку, и выводит реплику на экран в формате JAIME: переданная_строка.

Как назвать переменную, которая будет аргументом — решайте сами.

Наша система содержит код, скрытый от вас. В этом упражнении скрыт вызов функции printJaimesLine. Так мы проверяем ваше решение.

Вам не нужно самостоятельно вызывать функцию, только определить её. Но для наглядности — вот как наша система вызывает её:

App.printJaimesLine("Farewell, my friend...");

чтобы мы могли вызвать эту функцию из другого класса, нужно ее пометить не только ключевым словом static, но еще и public.

JAIME:  Farewell, my friend...

Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

Упражнение доступно только авторизованным пользователям.

Пожалуйста, авторизуйтесь с помощью учётной записи GitHub, это необходимо для отслеживания прогресса выполнения уроков. Если у вас ещё нет учётной записи, то сейчас самое время создать аккаунт на GitHub.