JavaRush /Курси /Java Syntax Zero /Параметри функцій в Java

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

Java Syntax Zero
Рівень 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 Zero, 7 рівень, 2 лекція
Недоступна
Улюблена страва
Улюблена страва
7
Задача
Java Syntax Zero, 7 рівень, 2 лекція
Недоступна
Ліверпульська четвірка
Ліверпульська четвірка

4. Передавання посилань в методи

Сподіваємося, ви зрозуміли все з попередньої лекції, тому що зараз ми знову розглянемо передавання аргументів у методи, тільки докладніше.

Як ви вже знаєте, деякі змінні в Java зберігають не самі значення, а адресу (посилання) блока пам'яті, в якому ці значення розміщені. Так працюють, наприклад, змінні-рядки або змінні-масиви.

Коли ви присвоюєте змінній-масиву іншу змінну-масив, що відбувається? Правильно. Дві змінні починають посилатися на один і той самий контейнер у пам'яті:

А що відбудеться, якщо одна з цих змінних буде змінною-параметром методу?

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


Метод sum обчислює суму чисел переданого масиву й виводить її на екран

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

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

Приміром, ми можемо написати свій власний метод, який заповнює двовимірний масив однаковими значеннями. Отакий вигляд міг би мати цей метод:

Код Пояснення
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 Zero, 7 рівень, 2 лекція
Недоступна
Правильний порядок
Правильний порядок

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 Zero, 7 рівень, 2 лекція
Недоступна
Універсальний солдат
Універсальний солдат
Коментарі (17)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Ivan Kravets Рівень 22
17 грудня 2023
остання задача геть не цікава ціла купа безглуздої писанини
Dmytrii Рівень 69
15 червня 2024
это упражнение на механическую память
ZSUnix Рівень 10
17 грудня 2024
Чому ж? Якщо підійти до цієї справи творчо, можна навіть розважитися. наприклад осьтак:
 
public class Solution {

    public static void main(String[] args) {

    }

    public static void universalMethod(){
        //1 
    }
    
    public static void universalMethod(int i1234567890987654321){
         //2                                           
    } 
    
    public static void universalMethod(byte skilbkuGodunZalushulosyaJutuHuylu){
         //3 
    }
    
    public static void universalMethod(PutinZdoh pz){
                                       
    }   //4 
    
    public static void universalMethod(String putinHuyloLaLaLaLaLaLaLaLa){
        //5                                 
    }                                    
    public static void universalMethod(long vidstanbDoNebaRachku){
        //6 
    } 
    public static void universalMethod(Dohuya naSkilkuSmatkivSvunosobakuRozruvayeFPV){
       //7 
    }
    public static void universalMethod(double adunPalkaDvaStrynaaaaYaXazyaykaVsyaStranaaaaaaaaaaa){                         
       //8  
    } 
    public static void universalMethod(float adunPalkaDvaStrynaaaa){          
       //9 
    } 
    public static void universalMethod(int[][][][][][][][][][][] matrucyaProstoryVMTeoriyi){
        //10 
    }  
    
        //напишіть тут ваш код                       
    protected class PutinZdoh{
        boolean don = false;     
        
        public boolean putinZdoh(){
            return !don;
        } 
    }    
        
    protected class Dohuya{
        long[] dohuya = new long[100500];  
    }    
}            
 
Доречі, це моє графоманство пройшо варифікацію з першого разу. тож не лінуйтеся розважати себе, і підходьте творчо до нудних завдань.
Grimnir Рівень 37
24 серпня 2025
Можна сприйняти її, щоб згадати 8 примітивів + String + без параметрів
Михайло Рівень 1 Expert
23 лютого 2023
задача про власника "Бешеної коняки топ"
Anonymous #3257141 Рівень 18
22 лютого 2023
В задачі "Правильний порядок", де потрібно було зробити реверс елементів масиву реалізував метод reverseArray через цикл for, але простіше. Результат виконання правильний, але рішення не було прийнято:( Тому прийшлося подивитися "правильне" рішення.
Олександр Рівень 18
3 листопада 2023
Я теж подивився відповідь, і тільки потім зрозумів, що в умові сказано що треба змінити порядок єлементів в масиві, а не змінити порядок виведення. В консоль по ітогу виведеться тільки два рядки, як і вказано в умові.
Гаркін Рівень 14
19 лютого 2024
Я також подивився рішення після здачи завдання. І рішення від JavaRush більш.. .елегантне. Я створював проміжний масив та два цикли for , а вони зуміли в одному циклі і без створення додаткового масиву. Треба запам'ятати собі таке рішення.
10 січня 2023
Добрый день. Кто знает помогите разобраться. При решение задачи с параметрами возникла ошибка что имя переменной уже используется: public static void universalMethod(int q); public static void universalMethod(String q); public static void universalMethod(String q,int q); После как заменив int q на int a, задачу приняли. public static void universalMethod(int q); public static void universalMethod(String q); public static void universalMethod(String q,int a); 1. Вопрос почему ошибку показало хотя это разные параметры? "Причому імена змінних-параметрів не враховуються" - так написано в уроке. 2. Если это даже считаются одинаковые параметры, почему параметр String да еще с одинаковой переменной не сработал как ошибку?
kivi Рівень 20
22 січня 2023
в третьому методі дві змінні мають однакову назву, не залежно від того чи ви їх декларували раніше (в 1 та 2 методі), у вас перший параметр це String q, тому при спробі задекларувати int q, воно вважає це за помилку, це називається "перегрузка" Згідно з документацією java: Компілятор не враховує тип повернення під час диференціювання методів, тому ви не можете оголосити два методи з однаковою сигнатурою, навіть якщо вони мають різний тип повернення. https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
HochDev Рівень 23
27 листопада 2022
Перейменування параметрів в IntelliJ IDEA оптимально робити через пункт меню Refactor-Rename.
Tehnik Рівень 11
1 листопада 2022
Привет всем. Подскажите, в задание с reverseArray, я создал новый масив int[ ] a, циклом присвоил ему значения в обратном порядке и потом добавил строку array = a. но к методу printArray все равно передается изначальный масив. по шагово просмотре, то масив а заполняется ноaрмально и в конце метода масив array имеет адрес и значения масива а. в чем тут дело?
Roma Chernesh Рівень 16
14 грудня 2022
Можно побачити код? Бо так незрозуміло. Взагалі-то, там задача дублювання масиву не потребує, але гадаю, що можно і таким (як ви описали) чином розв'язати
Neridnyi Taras Рівень 23
21 вересня 2022
завдання medium складності у валідатор не проходить, тим часом у jdk на пк легко проходить і результат правильний ?


    public static void reverseArray(int[] array) {
        // напишіть тут ваш код
        for (int i = array.length - 1; 0 < i + 1; i--) {
            System.out.print(array[i] + " , ");
        }
        System.out.println();
    }

і Код без помилок
Andriy Рівень 16
1 жовтня 2022
в консоль виводити не потрібно, потрібно зробити зміни саме в масиві
Oleksandr Рівень 23
15 жовтня 2022
void метод нічого не повертає, яким чином тоді повернуться данні назад?
Orest Orest Рівень 10
30 липня 2022
Розпакоука, сьодні неділя, був хліб 😂🤣 це до першої задачі 😆