JavaRush /Java блог /Random UA /Методи в Java
articles
15 рівень

Методи в Java

Стаття з групи Random UA
Методи в Java - 1У Java додаток складається з класів. Класи, своєю чергою, складаються із змінних. Вони відповідають за зберігання даних та методів, які відповідають за поведінку класу: інакше кажучи, логіку, яку він може надавати (наприклад, обробку деяких даних, виклик інших методів тощо). Говорити про такі складові, як змінні, можна довго, але ми сьогодні не для цього зібралися. Давайте краще поговоримо про таку складову класу як метод. Методи в Java - 2Метод- Це іменований блок коду, що оголошується всередині класу. Він містить деяку закінчену послідовність дій (інструкцій), спрямованих рішення окремої завдання, який можна багаторазово використовувати. Іншими словами, метод - це деяка функція: щось, що вміє робити ваш клас. В інших мовах також є функції. Тільки Java вони є членами класів і, відповідно до термінології ООП, називаються методами. Але перш ніж продовжити, розглянемо невеликий приклад:
public String constructHelloSentence(String name) {
  String resultSentence = "Hello world! My name is " + name;
  System.out.println(resultSentence);
  return resultSentence;
}
Тут нічого складного: метод Java, завдання якого сформувати рядок вітання з ім'ям, яке ми йому передаємо. Як наприклад - Hello world! My name is Bobby Давайте добре розберемося з побудовою методу, розглянувши кожне ключове слово в оголошенні методу (зліва направо). Наше перше ключове слово — public, і воно означає модифікатор доступу:

Модифікатори доступу

Вказують допустиму область видимості для членів класу, тобто обмеження місць, у яких дозволяється використовувати якусь змінну чи метод. Методи в Java - 3У мові Java застосовують такі модифікатори доступу:
  • public : публічний. Методи або поля з цим модифікатором загальнодоступні, видимі іншим класам (а точніше, їх методам та полям) з поточного та зовнішніх пакетів. Це найширший рівень доступу із відомих;

  • protected : до методів або змінних з цим модифікатором є доступ з будь-якого місця в поточному класі або пакеті, або в класах, що успадковують даний, а заодно - методи або поля, навіть якщо вони знаходяться в інших пакетах

    protected String constructHelloSentence(String name) {...}
  • Модифікатор за промовчанням. Якщо у поля або методу класу немає модифікатора, модифікатор застосовується за замовчуванням. У такому випадку поля або методи видно всім класам у поточному пакеті (як protected , тільки з відсутністю видимості при спадкуванні).

    String constructHelloSentence(String name) {...}
  • private : антипод модифікатора public . Метод або змінна з таким модифікатором доступні виключно у класі, в якому вони оголошені.

    private String constructHelloSentence(String name) {...}
Далі ми маємо Stringу сигнатурі методу (перший рядок методу, що описує його властивості).

Значення, що повертається

Значення, що повертається - це дані (якийсь результат виконання методу), які приходять на його місце після виклику. Кожен метод має значення, що повертається. Чи ні?

Методи з значенням, що повертається

Це значення може бути даними будь-якого виду: як змінної простого типу, і посилального. У прикладі ми вказуємо, що метод повинен повернути об'єкт типу String, що як ми пам'ятаємо, є класом, що описує рядок. Другий момент тут - слово return. Воно має пряме відношення до значення, що повертається: значення, що стоїть після нього, буде відправлено назад, на місце виклику методу, а сам же метод після returnзакриється. Це слово зазвичай йде в останньому рядку методу (крім методів із різними розгалуженнями типу if, else...). Якщо написати код у наступному рядку після return:
private String constructHelloSentence(String name) {
  String resultSentence = "Hello world! My name is " + name;
  return resultSentence;
  System.out.println(resultSentence);
}
то ми отримаємо лайки компілятора, що не дуже добре (компілятор нісенітниці не порадить). Також слід пам'ятати, що тип даних сповинен збігатися з оголошеним в сигнатурі методу. Докладніше про returnчитайте тут .

void

Для яких служить voidJava? Не у всіх методів є значення, що повертається. Декому чи нічого, чи не треба нічого повертати. Що тоді робити? Тоді в сигнатурі методу на місце значення, що повертається ми пишемо void. Як би виглядав наш метод без значення, що повертається?
protected void constructHelloSentence(String name) {
  String resultSentence = "Hello world! My name is " + name;
  System.out.println(resultSentence);
}
Ви напевно помітабо, що разом із значенням, що повертається, у нас зникло слово returnТак і є, адже наш метод і не повинен нічого повертати. Тим не менш, його можна тут поставити, але без якогось значення просто return; в останньому рядку. Це в цілому марно, тому в методах voidвін необов'язковий. Проте, його можна застосовувати з користю voidметодами, наприклад, при розгалуженнях або циклах, коли потрібно негайно вийти з методу. Далі в оголошенні методу у нас йшло constructHelloSentence.

Назви методів

constructHelloSentence - Назва методу, відмінна риса, за якою ми зможемо відрізняти той чи інший метод. І, відповідно, викликати той чи інший метод. Методи в Java - 4Назви методів повинні починатися з маленької літери, але використовувати верблюжий стиль (CamelCase, верблюжий регістр): тобто. кожне наступне слово в назві стоїть впритул до попереднього і пишеться з великої літери. Найменування методів повинні описувати метод (кращий коментар - правильне найменування). Для цього використовуйте дієслова або поєднання з дієсловами: getCat, delete, createCar, і таке інше. У межах одного класу імена методів мають бути унікальними (крім навантаження методів, про що поговоримо трохи нижче). Дивимося далі метод, що розбирається, і бачимо ( String name)

Параметри методу

Методи можуть мати (або не мати) певні дані, які надходитимуть зовні, а саме з місця, де і був викликаний метод. У нашому випадку ми бачимо, що приходить об'єкт типу Stringз ім'ям nameі надалі ми використовуємо цю змінну у нашому методі. У методі можна використовувати необмежену кількість параметрів, але більше 7 не рекомендується. Коли ми не знаємо точну кількість елементів, але всі ці елементи потрібні для однієї мети і будуть одного типу (наприклад, String), використовується багатокрапка:
public void constructHelloSentence(String...name) {
 ...
}
Звернення до кожного елемента буде такого вигляду: name[0] Нічого не нагадує? Правильно, масив! Нічого не зміниться, якщо ми напишемо:
protected void constructHelloSentence(String[] name) {
 ...
}
Звернення до елементів також буде виду: name[1] І ще дещо. Аргументи методу можуть бути final :
public String constructHelloSentence(final String name) {
  ...
}
Це означає, що посилання name прив'язана до конкретного об'єкту String, і перевизначити його не можна. Про роботу з посилальними змінними та їх взаємодію із зарезервованим словом finalможна прочитати в матеріалі " Посилальні типи даних в Java ".

Виклик методів

Отже, зі створенням методів розібралися, тепер поговоримо про їх використання. Як викликати метод Java? Методи в Java - 5Кожен метод Java знаходиться в класі. Щоб розібратися, як влаштований виклик методів Java, візьмемо клас:
public class StringConstructor {
  public String constructHelloSentence(String name) {
     String resultSentence = "Hello world! My name is " + name;
     System.out.println(resultSentence);
     return resultSentence;
  }
}
Так як у нас метод не є статичним (це окрема тема для розмови, що виходить за межі сьогоднішньої статті), для його виклику потрібно спочатку створити об'єкт, і вже у нього викликати метод:
class Application{
  public static void main(String[] args) {
     StringConstructor stringConstructor = new StringConstructor();
     stringConstructor.constructHelloSentence("Den");
  }
}
В аргументи нашого методу ми передали рядок (ім'я), який хочемо бачити в результуючому рядку, виведеному на екран:

Hello world! My name is Den
Також варто нагадати, що методи можна перевикористовувати ту кількість разів, скільки нам потрібно — обмежень немає.

this

Часто в коді можна побачити ключове слово this, як наприклад у сеттерах:
public void setValue(Long value) {
   this.value = value;
}
І що воно означає? thisJava — це посилання на поточний об'єкт цього класу. Наприклад, якщо ми створабо об'єкт:
StringConstructor stringConstructor = new StringConstructor();
то thisвсередині об'єкта stringConstructorбуде посиланням на той самий об'єкт. thisвикористовується як посилання на змінну об'єкта (як у сеттері вище), так виклику деякого методу. Ми можемо трохи переписати наш клас:
public class StringConstructor {

  public String constructHelloSentence(String name) {
     String resultSentence = this.getSentence()  + name;
     System.out.println(resultSentence);
     return resultSentence;
  }

  private String getSentence() {
     return "Hello world! My name is ";
  }
}
Через thisми викликаємо метод даного об'єкта для взяття необхідного рядка. Але все ж таки як правило для методів цього майже не використовується, так як і без нього йде посилання на метод даного об'єкта, в основному він використовується для змінної об'єкта.

Перевантаження методів

Припустимо нам знадобився метод, що виконує по суті ту саму логіку, але в пропозиції Hello world! замість worldми хочемо вставити своє слово (рядок). Але ж у нас вже є метод constructHelloSentence. Отже, нам потрібно вигадати нову назву для методу, який виконує по суті той самий функціонал? Як би не так: у цей момент на допомогу нам приходить навантаження методів. Методи в Java - 7Перевантаження методів - це використання одного і того ж імені методу кілька разів при його оголошенні у класі. З погляду синтаксису мови, може бути двох однакових імен у деякому локальному просторі. Але при цьому допускається оголошення методів з однаковими іменами, але різними аргументами. Іншими словами, клас містить у собі перевантажені, коли є два і більше методів з однаковими назвами, але різними вхідними даними:
public class Constructor {

  public String constructHelloSentence(String name) {
     String resultSentence = "Hello world! My name is " + name;
     System.out.println(resultSentence);
     return resultSentence;
  }

  protected String constructHelloSentence(String firstName, String secondName) {
     String resultSentence = "Hello " + firstName + "! My name is " + secondName;
     System.out.println(resultSentence);
     return resultSentence;
  }
}
Тут бачимо, що методи мають містити однаковий модифікатор доступу (як і тип, що повертається). Якщо викликається перевантажений метод, з кількох оголошених методів компілятор автоматично визначає потрібний за параметрами, які вказуються під час виклику.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ