JavaRush /Курсы /Java Syntax Pro /Параметры функции в Java

Параметры функции в Java

Java Syntax Pro
7 уровень , 2 лекция
Открыта

1. Передача параметров

А теперь начинается самое интересное. Как вы уже, наверное, знаете, по методам типа System.out.println(), в методы можно передавать параметры. Что, собственно говоря, очень сильно повышает пользу от создания и использования методов.

Так как же нам объявить метод с параметрами? На самом деле это довольно просто:

public static void имя(параметры)
{
   код метода
}

Где имя — это уникальное имя метода, а код метода — это команды, из которых состоит метод. А параметры — это параметры метода, перечисленные через запятую. Давайте лучше распишем этот шаблон более детально:

public static void имя(тип1 имя1, тип2 имя2, тип3 имя3)
{    код метода
}

Примеры:

Код Пояснение
public static void print(String str)
{
}
Объявлен метод print с параметром
String str
public static void print(String str, int count)
{
}
Объявлен метод print с двумя параметрами
String str
int count
public static void write(int x, int y)
{
}
Объявлен метод write с двумя параметрами
int x
int y

Если мы не хотим, чтобы у метода были параметры, просто оставляем круглые скобки пустыми.

Параметры — это специальные переменные метода. С их помощью в метод можно передавать различные значения при его вызове.

Давайте, например, напишем метод, который выводит на экран строку текста заданное количество раз.

Как написать код по выводу строки на экран несколько раз, вы уже знаете. Но какую именно строку выводить? И сколько раз? Вот для этого нам параметры и понадобятся.

Вот как будет выглядеть код этой задачи:

Код Пояснение
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Привет", 10);
     printLines("Пока", 20);
   }
}


Объявили метод printLines с параметрами:
String text, int count
Метод выводит на экран count раз строку text





Вызываем метод printLines с разными параметрами

Каждый раз при вызове метода его переменным-параметрам присваиваются переданные значения, и только потом начинают выполняться команды внутри метода


2. Аргументы метода

Еще немного вашего внимания хочу обратить на вызов метода с параметрами.

Те значения, которые передаются в метод, при его вызове принято называть аргументами метода.

Давайте еще раз разберем пример:

Код Пояснение
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.println(text);
   }

   public static void main(String[] args)
   {
     printLines("Привет", 10);
     printLines("Пока", 20);
   }
}


Объявили метод printLines с параметрами:
String text, int count
Метод выводит на экран count раз строку text




Вызываем метод printLines с параметрами
text = "Привет"; count = 10;
text = "Пока"; count = 20;

Когда метод printLines вызвался в первый раз, его переменным-параметрам были присвоены такие значения:
String text = "Привет", int count = 10.

Когда метод printLines вызвался во второй раз, его переменным-параметрам были присвоены другие значения:
String text = "Пока", int count = 20.

Параметры метода — это именно переменные, которым присваиваются определенные значения при вызове метода. Сами же значения "Привет", "Пока", 10 и 20 называются аргументами метода.


3. Конфликт имен переменных при вызове метода

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

Код Пояснение
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)
   {
     String str = "Привет";
     int n = 10;
     printLines(str, n);
   }
}


Объявили метод printLines с параметрами:
String text, int count
Метод выводит на экран count раз строку text







Вызываем метод printLines с параметрами:
text = str;
count = n;

Пока ничего сложного: у нас есть переменная str, ее значение присваивается переменной text при вызове метода. У нас есть переменная n, ее значение присваивается переменной count при вызове метода. Пока все понятно.

А теперь давайте переименуем наши переменные в методе main:

Код Пояснение
class Solution
{
   public static void printLines(String text, int count)
   {
     for (int i = 0; i < count; i++)
       System.out.print(text);
   }

   public static void main(String[] args)    {
     String text = "Привет";
     int count = 10;
     printLines(text, count);
   }
}


Объявили метод printLines с параметрами:
String text, int count
Метод выводит на экран count раз строку text







Вызываем метод printLines с параметрами:
text = text;
count = count;

Обратите внимание на две вещи

Первое: у нас есть переменные с одинаковыми именами в разных методах. Это разные переменные (мы их специально раскрасили в разные цвета). Все работает так же, как и в предыдущем примере, когда переменные в методе main назывались str и n.

Второе: при вызове метода никакого волшебства не происходит. Переменным-параметрам просто присваиваются значения аргументов. Независимо от того, это конкретные числа, строки, переменные или выражения.

После переименования переменных в методе main ничего не поменялось. Это как были разные переменные в разных методах, так и остались. Никакой магической связи между переменными text и text нет.


7
Задача
Java Syntax Pro, 7 уровень, 2 лекция
Недоступна
Любимое блюдо
Переименуй параметры метода printPersonInfo(): - firstName в name; - lastName в surname; - favoriteDish в meal; таким образом, чтобы функционал программы остался неизменным. Имена переменных в методе main() оставь без изменений.
7
Задача
Java Syntax Pro, 7 уровень, 2 лекция
Недоступна
Ливерпульская четверка
Метод createCrew() выводит должности и имена членов экипажа космического корабля. Во избежание путаницы внутри метода, измени имена параметров createCrew(), чтобы они соответствовали именам переменных, которые передаются в метод: - name1 в navigator - name2 в pilot - name3 в secondPilot - name4 в fl

4. Передача ссылок в методы

Надеюсь, вы поняли все из предыдущей лекции, потому что сейчас мы снова затронем передачу аргументов в методы, только еще глубже.

Как вы уже знаете, некоторые переменные в Java хранят не сами значения, а адрес (ссылку) блока памяти, где эти значения находятся. Так, например работают переменные-строки или переменные-массивы.

Когда вы присваиваете переменной-массиву другую переменную-массив, что происходит? Правильно. Две переменные начинают ссылаться на один и тот же контейнер в памяти:

Передача ссылок в методы

А что произойдет, если одна из этих переменных будет переменной-параметром метода?

Код Пояснение
class Solution
{
   public static void printArraySum(int[] data)
   {
     int sum = 0;
     for (int i = 0; i < data.length; i++)
       sum = sum + data[i];
     System.out.println(sum);
   }
   
   public static void main(String[] args)
   {
     int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30};
     printArraySum(months);
   }
}


Метод printArraySum считает сумму чисел переданного массива и выводит ее на экран

Произойдет ровно то же самое: переменная-параметр data будет содержать ссылку на тот же контейнер, что и переменная months. При вызове метода просто произойдет присваивание data = months.

А раз обе переменные ссылаются на один и тот же контейнер целых чисел, то метод printArraySum может не просто читать значения из массива, но и менять их!

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

Код Пояснение
class Solution
{
   public static void fill(int[][] data, int value)
   {
     for (int i = 0; i < data.length; i++)
     {
       for (int j = 0; j < data[i].length; j++)
         data[i][j] = value;
     }
  }

   public static void main(String[] args)
   {
     int[][] months = {{31, 28}, {31, 30, 31}, {30, 31, 31}};
     fill (months, 8);
   }
}


Метод fill проходится по всем ячейкам переданного двумерного массива и присваивает им значение value.








Создаем двумерный массив.
Заполняем весь массив числом 8.

7
Задача
Java Syntax Pro, 7 уровень, 2 лекция
Недоступна
Правильный порядок
Напишем утилиту для работы с массивами. Основная часть функционала готова: метод printArray() выводит в консоли все элементы массива. Тебе осталась мелочь: реализовать метод reverseArray(). Он должен менять порядок элементов массива на обратный. Метод должен работать только с массивами целочисленных

5. Методы с одинаковыми именами

А теперь еще раз вернемся к именам методов.

Стандарты Java требуют, чтобы у всех методов внутри одного класса были уникальные имена. Т.е. невозможно объявить в одном классе два одинаковых метода.

Только вот при сравнении методов на одинаковость учитываются не только имена, но и типы параметров! Причем имена переменных-параметров не учитываются. Примеры:

Код Пояснение
void fill(int[] data, int value) {
}
void fill(int[][] data, int value) {
}
void fill(int[][][] data, int value)  {
}
Эти три метода считаются разными. Их можно объявить в одном классе.
void print(String str) {
}
void print(String str, String str2) {
}
void print(int val) {
}
void print(double val) {
}
void print() {
}
Все эти пять методов считаются разными. Их можно объявить в одном классе.
void sum(int x, int y) {
}
void sum(int data, int value) {
}
Эти два метода считаются одинаковыми (их нельзя объявить в одном классе).

Почему же одни методы считаются одинаковыми, а другие — разными? И почему не учитываются имена переменных-параметров при определении уникальности метода?

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

Например вы пишете System.out.println("Привет") Компилятор умный, и он легко сделает вывод, что тут вызывается метод println() с параметром типа String.

А если вы напишете System.out.println(1.0), компилятор увидит тут вызов метода println() с параметром типа double.

Компилятор следит, чтобы при вызове метода типы аргументов и параметров совпадали, а на имя аргумента не обращает никакого внимания. В Java имена переменных-параметров никак не помогают компилятору определить вызываемый метод. Поэтому и не учитываются при определении уникальности метода.

Имя метода и типы его параметров называются сигнатурой метода. Пример: sum(int, int)

Каждый класс должен иметь не методы с уникальными именами, а методы с уникальными сигнатурами.


7
Задача
Java Syntax Pro, 7 уровень, 2 лекция
Недоступна
Универсальный солдат
Неплохо было бы иметь один метод для решения различных задач. У тебя есть возможность написать такой. Создай еще 9 методов universalMethod(). В сумме их должно получиться 10. Параметры, которые они должны принимать, придумай сам.

Комментарии (376)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3585174 Уровень 12
5 июня 2025
like
REK.QA Уровень 9
1 июня 2025
Тот момент, когда в первой задаче вместо meal написал mael, и всё, ты лох)))
Ivan Уровень 14
27 апреля 2025

public static void reverseArray(int[] array) {
        int[] array2 = Arrays.copyOf(array, array.length);
        int j = 0;
        for (int i = array.length - 1; i >= 0; i--) {
            array[i] = array2[j];
            j++;
        }
    }
делаем дубликат массива(метод Arrays.copyOf()) и с помощью цикла for меняем местами последний элемент двойника с первым элементом основного массива. возможно это плохое решение если исходный массив будет на 1млрд ячеек, но чтобы понять что происходит в решении предлагаемом автором курса нужно иметь годы опыта работы с массивами. for (int i = 0; i < array.length / 2; i++) { int temp = array[i]; array[i] = array[array.length - i - 1]; array[array.length - i - 1] = temp; } без понятия как такое решение может прийти в голову новичку.
Яндекс Профиль Уровень 13
9 мая 2025

public static void reverseArray(int[] array) {
        //напишите тут ваш код
        int[] arrTemp = Arrays.copyOf(array, array.length);

        for (int i = 0, j = array.length - 1; i < array.length; i++, j--) {
            array[i] = arrTemp[j];
        }
    }
А такое как?
Danya Уровень 17
22 марта 2025
хз хз чет ваще не понятно мин 15 подумал над решением задачи по итогу выбрал правильный ответ дало такой код: for (int i = 0; i < array.length / 2; i++) { int temp = array[i]; array[i] = array[array.length - i - 1]; array[array.length - i - 1] = temp; } и даже в нем мало че понятно сложная тема для меня
Конь Уровень 26
23 марта 2025
По строкам: 1) for (int i = 0; i < array.length / 2; i++) Так как будем менять местами элементы массива попарно (самый первый с последним, следующий с предпоследним), нам нужно остановится на первой половине массива. Иначе, если пойдём дальше, элементы, которые были перенесены во вторую половину снова начнут меняться со своей парой и каждый элемент вернётся на своё место, то есть порядок не поменяется. 2) int temp = array[i]; Переменная temp нужна для того, чтобы записать в неё первый элемент из пары, который мы будем менять. Представим, что у нас есть два грузовика: в Камазе песок, в Зиле щебень. Нам нужно перегрузить их так, чтобы в Камазе оказался щебень, а в Зиле песок. Чтобы это сделать, нужно один из грузовиков разгрузить, так как место занято и перекладывать что-то из другого грузовика просто некуда. Пример образный, понятно, что мы не забираем из элемента массива значение, а просто копируем его. Это нужно для того, чтобы не потерять данное значение, когда мы перепишем элемент массива (array[i]). 3) array[i] = array[array.length - i - 1]; Теперь мы копируем значение второго элемента пары (array.length - i - 1) в первый элемент пары (array[i]). На примере: i = 0; array[0] - первый элемент массива; array.length - 0 - 1 - последний элемент массива. Здесь из длинны массива мы вычитаем единицу, так как последний индекс массива всегда меньше его длины на один (из-за начала нумерации с 0). И также вычитаем i, для того чтобы значение изменялось на каждой итерации цикла. Получается в цикле мы проходим массив сразу с двух сторон: слева по i, справа по длина массива - i - 1. И вспоминаем первый пункт, поэтому мы и указываем в условии i < половины длины массива. 4) array[array.length - i - 1] = temp; И вот нам пригодилась переменная temp, в которую мы сохранили значение array[i]. Для наглядности по строкам первая итерация цикла (массив из примера): 1) array.length / 2 = 4; 2) temp = 11; 3) array[i] = 99; 4) array[array.length - i - 1] = 11;
Александр Уровень 31
1 апреля 2025
Просто продебаж этот код в IDE, и разберешься.
Danya Уровень 17
1 апреля 2025
да я уже понимаю что значит этот код но дебажить не умею)
Андрей Уровень 15
21 апреля 2025
А ещё for позволяет сделать так: public static void reverseArray(int[] array) { for (int i = 0, j = (array.length-1); i < j; i++, j--) { int temp = array[i]; array[i] = array[j]; array[j] = temp; }
Artem Уровень 11
12 февраля 2025

public static void reverseArray(int[] array) {
        for (int i = array.length; i > 0; i--) {
            System.out.print(array[i - 1] + ", ");
        }
        System.out.println();
    }
Я искренне не понимаю, почему не пускает мой код в задании "Правильный порядок"
Diamond Уровень 10
13 февраля 2025
Ты выводишь масссив в обратном порядке, но порядок элементов осталсе тем же. Грубо говоря, тебе нужно отсортировать массив в обратном порядке, а не выводить.
Killua Уровень 14
6 марта 2025
Тебе не надо выводить обратной порядок, тебе его (обратный порядок) надо сохранить в массиве. А у тебя порядок не изменился, он остался тем же. printArray(array); // выводим массив reverseArray(array); // меняем порядок массива printArray(array); // выводим изменённый порядок массива
Александр Уровень 31
1 апреля 2025
Ты поменял не структуру массива, а просто вывел его в обратном порядке))
Семён Уровень 66
8 февраля 2025
Сначала меня ппц триггерили вот эти приколы с одинаковыми переменными: В классе Text создаем поле text. Потом создаем геттеры и сеттеры: getText, setText. В сеттер getText передаем аргумент text. Этот метод возвращает переменную text и присваивает ее полю text. И если что, с помощью метода setText можем присвоить полю text новую переменную text. Ах да! Еще делаем конструктор, в который обязательно нужно передать параметр text, чтобы создался новый объект класса Text. И у этого объекта класса Text поле text равнялось той самой переданной переменной text. 😂😂😂😂 В начале нихрена не понял. А потом решал задачи. И как понял!!! ахахха Особенно, когда решал задачи Game: 2048, змейка и тд. После этих задач вот эти классы, конструкторы, методы, геттеры, сеттеры - уже на автомате фигачишь
Матвей Уровень 14
23 января 2025
тему трудно принимать
Diamond Уровень 10
13 февраля 2025
Просто смирись)
Cryptosin Уровень 21
29 декабря 2024
а у меня такое решение получилось с разворотом массива

/*сразу создаем две переменные. одну начального элемента, а другую конечного.
первую увеличиваем, а вторую, соответственно, уменьшаем, 
что бы встретиться в середине массива*/
  for (int i = 0, j = array.length - 1; i < array.length; i++, j--) { 
  int temp = array[i]; //тут вроде все понятно
  array[i] = array[j];
  array[j] = temp;
  if (i == j || (i + 1) == j) break; //прерываем цикл, если дошлии до середины массива
}
19 января 2025
If отбросить можно, условие в false уйдет. Debug очень сильно помогает заметить такие моменты)
Джон Смит Уровень 8
19 января 2025
Зачем так усложнять? В приложении хорошая подсказка дана:

array[array.length - i - 1]
Один индекс, одна временная переменная и три строки кода + for(). //прерываем цикл, если дошлии до середины массива А вот тут совсем непонятно, сразу поделить длину массива пополам не?
20 марта 2025
Ого, не знал что for может содержать сразу несколько итераторов (переменные i и j). Спасибо за пример! Я решил задачу используя способ определения ячейки с конца как коментатор выше, но твой понравился больше.
Soup🍲 Уровень 15
17 декабря 2024
ставь лайк,если в средней задаче импортировал класс Arrays и воспользовался методом копирования :), потому что лень было делать циклом .
Rust =)) Уровень 14
28 декабря 2024
Arrays - сила. Но как без цикла скопировать элементы массива задом наперед?
Cryptosin Уровень 21
29 декабря 2024
а нет метода реверсивной сортировки?
Rust =)) Уровень 14
29 декабря 2024
Может быть и есть, не встречал =)
Anonymous #3478746 Уровень 11
15 ноября 2024
/* Комментарий удален */
4kTurboPlayer Уровень 9
23 ноября 2024
лол
Денис Кокшаров Уровень 32
11 января 2025
чтож там было...
Anonymous #3478746 Уровень 11
16 апреля 2025
уже не помню, самому интересно)