Методы могут не только возвращать значения, но и принимать их в виде параметров. С параметрами методов мы уже сталкивались много раз:
// Принимает на вход один параметр любого типа
System.out.println("я параметр");
// Принимает на вход индекс, по которому извлекается символ
"какой-то текст".charAt(3); // 'о'
// Принимает на вход два строковых параметра
// Первый — что ищем, второй — на что меняем
"google".replace("go", "mo"); // "moogle"
// Принимает на вход два числовых параметра
// первый — начальный индекс включительно, второй — конечный индекс не включительно
"hexlet".substring(1, 3); // "ex"
В этом уроке мы научимся создавать методы, которые принимают на вход параметры.
Представим, что перед нами стоит задача — реализовать статический метод App.getLastChar()
. Он должен возвращать последний символ в строке, переданной на вход как параметр.
Вот как будет выглядеть использование этого метода:
// Передача параметров напрямую без переменных
App.getLastChar("Hexlet"); // 't'
App.getLastChar("Goo"); // 'o'
// Передача параметров через переменные
var name1 = "Hexlet";
App.getLastChar(name1); // 't'
var name2 = "Goo";
App.getLastChar(name2); // 'o'
Из описания и примеров кода мы можем сделать следующие выводы:
getLastChar()
в классе App
String
char
Для начала определим метод:
class App {
public static char getLastChar(String str) {
// Вычисляем индекс последнего символа как длина строки, то есть 1
return str.charAt(str.length() - 1);
}
}
https://replit.com/@hexlet/java-basics-methods-parameters-1
Разберем этот код подробнее. char
говорит нам о типе возвращаемого значения. Далее в скобках указывается тип параметра String
и его имя str
.
Внутри метода мы не знаем, с каким конкретно значением идет работа, поэтому параметры всегда описываются как переменные.
Имя параметра может быть любым — оно не связано с тем, как вызывается метод. Главное, чтобы это имя отражало смысл того значения, которое содержится внутри. Конкретное значение параметра будет зависеть от вызова этого метода.
Параметры в Java всегда обязательны. Если методу нужны параметры, а мы попробуем написать код без параметра, то компилятор выдаст ошибку:
App.getLastChar(); // такой код не имеет смысла
method getLastChar in class App cannot be applied to given types;
required: String
found: no arguments
reason: actual and formal argument lists differ in length
Точно таким же образом можно указывать два и более параметра. Каждый параметр отделяется запятой:
class App {
// Метод по нахождению среднего числа
// Возвращаемый тип — double, потому что
// при делении может получиться дробное число
public static double average(int x, int y) {
return (x + y) / 2.0;
}
}
App.average(1, 5); // 3.0
App.average(1, 2); // 1.5
https://replit.com/@hexlet/java-basics-methods-parameters-2
Методы могут требовать на вход любое количество параметров, которое им нужно для работы:
// первый параметр – что ищем
// второй параметр – на что меняем
'google'.replace('go', 'mo'); // moogle
Для создания таких методов, нужно в определении указать нужное количество параметров через запятую, дав им понятные имена. Ниже пример определения метода replace()
, который заменяет в слове одну часть строки на другую:
class App {
public static String replace(String text, String from, String to) {
// здесь тело метода, но мы его
// опускаем, чтобы не отвлекаться
}
}
App.replace('google', 'go', 'mo'); // moogle
Когда параметров два и более, то практически для всех методов становится важен порядок передачи этих параметров. Если его поменять, то метод отработает по-другому:
// ничего не заменилось,
// так как внутри google нет mo
App.replace('google', 'mo', 'go'); // google
Реализуйте статический метод App.truncate()
, который обрезает переданную строку до указанного количества символов, добавляет в конце многоточие и возвращает получившуюся строку. Подобная логика часто используется на сайтах, чтобы отобразить длинный текст в сокращенном виде. Метод принимает два параметра:
String
), которую нужно обрезатьint
) символов, которые нужно оставитьПример того, как должен работать написанный вами метод:
// Передаем текст напрямую
// Обрезаем текст, оставляя 2 символа
App.truncate("hexlet", 2); // he...
// Через переменную
var text = "it works!"
// Обрезаем текст, оставляя 4 символа
App.truncate(text, 4); // it w...
Реализовать этот метод можно различными способами, подскажем лишь один из них. Для решения этим способом вам понадобится взять подстроку из строки, переданной первым параметром в метод truncate()
. Используйте для этого метод substring(). Подумайте, исходя из задания, с какого индекса и по какой вам надо извлечь подстроку?
var text = "welcome";
// Передавать параметры в метод можно через переменные
var index = 3;
text.substring(0, index); // wel
С точки зрения проверочной системы не имеет значения, каким из способов будет реализован метод truncate()
внутри, главное – чтобы он выполнял поставленную задачу
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Ваше упражнение проверяется по этим тестам
1import static org.assertj.core.api.Assertions.assertThat;
2
3class Test {
4 public static void main(String[] args) {
5 var actual1 = App.truncate("текст", 3);
6 assertThat(actual1).isEqualTo("тек...");
7
8 var actual2 = App.truncate("и пошла вода", 5);
9 assertThat(actual2).isEqualTo("и пош...");
10 }
11}
12
Решение учителя откроется через: