1. Передача параметрів
А тепер найцікавіше. Як ви вже, мабуть, знаєте, за методами типу System.out.println(), у методи можна передавати параметри. Що, власне кажучи, дуже сильно підвищує користь від створення та використання методів.
То як же нам оголосити метод із параметрами? Насправді це досить просто:
public static void ім'я(параметри)
{
код методу
}
Де ім'я — це унікальне ім'я методу, а код методу — це команди, з яких складається метод. А параметри — це параметри метода, перелічені через кому. Давайте краще розпишемо цей шаблон більш детально:
public static void ім'я(тип1 ім'я1, тип2 ім'я2, тип3 ім'я3)
{ код методу
}
Приклади:
| Код | Пояснення |
|---|---|
|
Оголошено метод print з параметромString str |
|
Оголошено метод print з двома параметрамиString strint count |
|
Оголошено метод write з двома параметрамиint xint y |
Якщо ми не хочемо, щоб у методу були параметри, просто залишаємо круглі дужки порожніми.
Параметри — це спеціальні змінні метода. З їх допомогою у метод можна передавати різні значення під час його виклику.
Давайте, наприклад, напишемо метод, який виводить на екран рядок тексту задану кількість разів.
Як написати код для виводу рядка на екран кілька разів, ви вже знаєте. Але який саме рядок виводити? І скільки разів? Ось для цього нам параметри і потрібні.
Ось як виглядатиме код цього завдання:
| Код | Пояснення |
|---|---|
|
Оголосили метод printLines з параметрами:String text, int countМетод виводить на екран count разів рядок textВикликаємо метод printLines з різними параметрами |
Кожного разу під час виклику метода його змінним-параметрам присвоюються передані значення, і тільки після цього починають виконуватись команди всередині метода
2. Аргументи методу
Ще трохи вашої уваги хочу звернути на виклик методу з параметрами.
Ті значення, які передаються в метод, під час його виклику, прийнято називати аргументами методу.
Давайте ще раз розберемо приклад:
| Код | Пояснення |
|---|---|
|
Оголосили метод 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. Конфлікт імен змінних при виклику методу
В якості аргументів методу можна використовувати змінні. Це просто і зрозуміло, але потенційно може викликати деякі труднощі. Розглянемо той самий приклад, але винесемо аргументи в окремі змінні:
| Код | Пояснення |
|---|---|
|
Оголосили метод printLines з параметрами:String text, int countМетод виводить на екран count разів рядок textВикликаємо метод printLines з параметрами:text = str;count = n; |
Поки нічого складного: у нас є змінна str, її значення присвоюється змінній text при виклику методу. У нас є змінна n, її значення присвоюється змінній count при виклику методу. Поки все зрозуміло.
А тепер давайте перейменуємо наші змінні в методі main:
| Код | Пояснення |
|---|---|
|
Оголосили метод printLines з параметрами:String text, int countМетод виводить на екран count разів рядок textВикликаємо метод printLines з параметрами:text = text;count = count; |
Зверніть увагу на дві речі
Перше: у нас є змінні з однаковими іменами в різних методах. Це різні змінні (ми їх спеціально позначили різними кольорами). Все працює так само, як і в попередньому прикладі, коли змінні в методі main називалися str і n.
Друге: при виклику методу ніякого чаклунства не відбувається. Змінним-параметрам просто присвоюються значення аргументів. Незалежно від того, це конкретні числа, рядки, змінні чи вирази.
Після перейменування змінних в методі main нічого не змінилося. Це як були різні змінні в різних методах, так і залишилися. Ніякого магічного зв'язку між змінними text та text немає.
4. Передача посилань у методи
Сподіваюся, ти зрозумів усе з попередньої лекції, тому що зараз ми знову зачепимо передачу аргументів у методи, тільки ще глибше.
Як ти вже знаєш, деякі змінні у Java не зберігають самі значення, а адресу (посилання) блоку пам'яті, де ці значення знаходяться. Наприклад, так працюють змінні-рядки або змінні-масиви.
Коли ти присвоюєш змінній-масиву іншу змінну-масив, що відбувається? Правильно. Дві змінні починають посилатися на один і той же контейнер у пам'яті:

А що станеться, якщо одна з цих змінних буде змінною-параметром методу?
| Код | Пояснення |
|---|---|
|
Метод printArraySum рахує суму чисел переданого масиву і виводить її на екран |
Станеться те ж саме: змінна-параметр data буде містити посилання на той же контейнер, що і змінна months. Під час виклику методу просто відбудеться присвоєння data = months.
А раз обидві змінні посилаються на один і той же контейнер цілих чисел, то метод printArraySum може не просто читати значення з масиву, але й змінювати їх!
Наприклад, ми можемо написати свій власний метод, який заповнює двовимірний масив однаковими значеннями. Ось як він міг би виглядати:
| Код | Пояснення |
|---|---|
|
Метод fill проходиться по всім осередкам переданого двовимірного масиву і присвоює їм значення value.Створюємо двовимірний масив. Заповнюємо весь масив числом 8. |
5. Методи з однаковими іменами
А тепер ще раз повернемося до імен методів.
Стандарти Java вимагають, щоб усі методи всередині одного класу мали унікальні імена. Тобто неможливо оголосити в одному класі два однакових методи.
Тільки ось при порівнянні методів на однаковість враховуються не тільки імена, а й типи параметрів! Причому імена змінних-параметрів не враховуються. Приклади:
| Код | Пояснення |
|---|---|
|
Ці три методи вважаються різними. Їх можна оголосити в одному класі. |
|
Усі ці п’ять методів вважаються різними. Їх можна оголосити в одному класі. |
|
Ці два методи вважаються однаковими (їх не можна оголосити в одному класі). |
Чому ж одні методи вважаються різними, а інші — однаковими? І чому не враховуються імена змінних-параметрів при визначенні унікальності методу?
Навіщо взагалі потрібна унікальність? Уся справа в тому, що коли компілятор компілює вашу програму, він має точно знати, яку саме функцію/метод ви викликаєте в певному місці.
Наприклад, ви пишете System.out.println("Привіт"). Компілятор розумний, і він легко зробить висновок, що тут викликається метод println() із параметром типу String.
А якщо ви напишете System.out.println(1.0), компілятор побачить тут виклик методу println() із параметром типу double.
Компілятор стежить, щоб під час виклику методу типи аргументів і параметрів збігалися, а на ім’я аргументу не звертає жодної уваги. У Java імена змінних-параметрів ніяк не допомагають компілятору визначити викликаний метод. Тому їх і не враховують при визначенні унікальності методу.
Ім’я методу та типи його параметрів називаються сигнатурою методу. Приклад: sum(int, int)
Кожен клас має мати не методи з унікальними іменами, а методи з унікальними сигнатурами.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ