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 застосовують такі модифікатори доступу:-
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
Для яких служитьvoid
Java? Не у всіх методів є значення, що повертається. Декому чи нічого, чи не треба нічого повертати. Що тоді робити? Тоді в сигнатурі методу на місце значення, що повертається ми пишемо void
. Як би виглядав наш метод без значення, що повертається?
protected void constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
}
Ви напевно помітабо, що разом із значенням, що повертається, у нас зникло слово return
Так і є, адже наш метод і не повинен нічого повертати. Тим не менш, його можна тут поставити, але без якогось значення просто return
; в останньому рядку. Це в цілому марно, тому в методах void
він необов'язковий. Проте, його можна застосовувати з користю void
методами, наприклад, при розгалуженнях або циклах, коли потрібно негайно вийти з методу. Далі в оголошенні методу у нас йшло constructHelloSentence
.
Назви методів
constructHelloSentence
- Назва методу, відмінна риса, за якою ми зможемо відрізняти той чи інший метод. І, відповідно, викликати той чи інший метод. Назви методів повинні починатися з маленької літери, але використовувати верблюжий стиль (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 знаходиться в класі. Щоб розібратися, як влаштований виклик методів 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;
}
І що воно означає? this
Java — це посилання на поточний об'єкт цього класу. Наприклад, якщо ми створабо об'єкт:
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
. Отже, нам потрібно вигадати нову назву для методу, який виконує по суті той самий функціонал? Як би не так: у цей момент на допомогу нам приходить навантаження методів. Перевантаження методів - це використання одного і того ж імені методу кілька разів при його оголошенні у класі. З погляду синтаксису мови, може бути двох однакових імен у деякому локальному просторі. Але при цьому допускається оголошення методів з однаковими іменами, але різними аргументами. Іншими словами, клас містить у собі перевантажені, коли є два і більше методів з однаковими назвами, але різними вхідними даними:
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;
}
}
Тут бачимо, що методи мають містити однаковий модифікатор доступу (як і тип, що повертається). Якщо викликається перевантажений метод, з кількох оголошених методів компілятор автоматично визначає потрібний за параметрами, які вказуються під час виклику.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ