HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>В этой статье мы поговорим про методы в Java и о том, зачем они нужны. Это основы, которые должен знать каждый начинающий программист.</p>
1 <p>В этой статье мы поговорим про методы в Java и о том, зачем они нужны. Это основы, которые должен знать каждый начинающий программист.</p>
2 <h2>Метод - что это?</h2>
2 <h2>Метод - что это?</h2>
3 <p>Практически любой код на Java включает в себя<strong>методы</strong>. Говоря простым языком, методы - это строительные блоки, из которых и состоит Java-программа.</p>
3 <p>Практически любой код на Java включает в себя<strong>методы</strong>. Говоря простым языком, методы - это строительные блоки, из которых и состоит Java-программа.</p>
4 <h2>Метод в 2-х словах</h2>
4 <h2>Метод в 2-х словах</h2>
5 <p>Видите в программе слово, за которым следуют круглые скобки? Это и есть метод, например:</p>
5 <p>Видите в программе слово, за которым следуют круглые скобки? Это и есть метод, например:</p>
6 - <p>А вот сразу названия четырёх методов:</p>
6 + <p>А вот сразу азвания четырёх методов:</p>
7 println() hasNextInt() getNumber() main()<p>А вот формат, который используется<strong>для определения метода</strong>:</p>
7 println() hasNextInt() getNumber() main()<p>А вот формат, который используется<strong>для определения метода</strong>:</p>
8 возвращаемый тип - идентификатор метода (параметры) { тело метода }<h2>Зачем нужны методы?</h2>
8 возвращаемый тип - идентификатор метода (параметры) { тело метода }<h2>Зачем нужны методы?</h2>
9 <p>Поясним это на примере упрощённой программы-калькулятора. Допустим, она должна уметь выполнять лишь четыре операции: деление, умножение, сложение и вычитание. При написании такого приложения мы бы попросили пользователя о следующих действиях: 1) ввести два числа; 2) выбрать нужную математическую операцию.</p>
9 <p>Поясним это на примере упрощённой программы-калькулятора. Допустим, она должна уметь выполнять лишь четыре операции: деление, умножение, сложение и вычитание. При написании такого приложения мы бы попросили пользователя о следующих действиях: 1) ввести два числа; 2) выбрать нужную математическую операцию.</p>
10 <p>Наш код в<strong>Java</strong>:</p>
10 <p>Наш код в<strong>Java</strong>:</p>
11 import java.util.Scanner; public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); } }<p>Но это не полный код, а лишь его кусочек, включающий главный метод main. Что мы тут видим? То, что метод выполняется в каждой строчке:</p>
11 import java.util.Scanner; public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); } }<p>Но это не полный код, а лишь его кусочек, включающий главный метод main. Что мы тут видим? То, что метод выполняется в каждой строчке:</p>
12 <p>Всё подчёркнутое - это методы, включая main. Давайте запишем это схематически:</p>
12 <p>Всё подчёркнутое - это методы, включая main. Давайте запишем это схематически:</p>
13 <p>Что же делают данные методы, и какова<strong>логика кода</strong>? На самом деле, каждый метод отвечает за определённое действие:</p>
13 <p>Что же делают данные методы, и какова<strong>логика кода</strong>? На самом деле, каждый метод отвечает за определённое действие:</p>
14 <h2>Два типа методов</h2>
14 <h2>Два типа методов</h2>
15 <p>Обратите внимание, что в нашем коде представлены 2 типа методов: 1) методы, которые<strong>уже известны</strong>: - main(); - println(); 2) методы, которые<strong>мы написали сами</strong>: - getNumber(); - getOperation(); - calc().</p>
15 <p>Обратите внимание, что в нашем коде представлены 2 типа методов: 1) методы, которые<strong>уже известны</strong>: - main(); - println(); 2) методы, которые<strong>мы написали сами</strong>: - getNumber(); - getOperation(); - calc().</p>
16 <p>Итак, методы в Java можно разделить на 2 категории: 1.<strong>Стандартные методы</strong>. Они написаны в стандартных<strong>Java-библиотеках</strong>. Мы берём нужный метод и используем его. 2.<strong>Пользовательские методы</strong>. Это методы, написанные нами.</p>
16 <p>Итак, методы в Java можно разделить на 2 категории: 1.<strong>Стандартные методы</strong>. Они написаны в стандартных<strong>Java-библиотеках</strong>. Мы берём нужный метод и используем его. 2.<strong>Пользовательские методы</strong>. Это методы, написанные нами.</p>
17 <h2>Как методы размещаются в программе?</h2>
17 <h2>Как методы размещаются в программе?</h2>
18 <p>Вернёмся к нашим методам, как к "строительным блокам". Как правильно размещать эти кирпичики?</p>
18 <p>Вернёмся к нашим методам, как к "строительным блокам". Как правильно размещать эти кирпичики?</p>
19 <p>Схематически это можно показать следующим образом:</p>
19 <p>Схематически это можно показать следующим образом:</p>
20 <p>Теперь давайте напишем нашу программу-калькулятор полностью:</p>
20 <p>Теперь давайте напишем нашу программу-калькулятор полностью:</p>
21 import java.util.Scanner; public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); } public static double getNumber() { Scanner sc = new Scanner(System.in); System.out.println("Введите число:"); if(sc.hasNextDouble()) { return sc.nextDouble(); } else { System.out.println("Ошибка при вводе. Повторите ввод"); return getNumber(); } } public static char getOperation() { Scanner sc = new Scanner(System.in); System.out.println("Выберите номер операции:\n1 - прибавить\n2 - отнять\n3 - умножить\n4 - разделить"); int operationNumber = 0; if(sc.hasNextInt()) { operationNumber = sc.nextInt(); } else { System.out.println("Вы ввели не число! Повторите ввод!"); return getOperation(); } switch (operationNumber) { case 1: return '+'; case 2: return '-'; case 3: return '*'; case 4: return '/'; default: System.out.println("Неправильная операция! Повторите ввод!"); return getOperation(); } } public static double add(double num1, double num2) { return num1+num2; } public static double sub(double num1, double num2) { return num1-num2; } public static double mul(double num1, double num2) { return num1*num2; } public static double div(double num1, double num2) { if(num2 != 0.0) { return num1/num2; } else { System.out.println("На 0 делить нельзя!"); return Double.NaN; } } public static double calc(double num1, double num2, char operation) { switch (operation) { case '+': return add(num1, num2); case '-': return sub(num1, num2); case '*': return mul(num1, num2); case '/': return div(num1, num2); default: return Double.NaN; } } }<p>Не стоит пугаться, код не такой большой, как кажется. Особенно, если мы представим его схематически:</p>
21 import java.util.Scanner; public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); } public static double getNumber() { Scanner sc = new Scanner(System.in); System.out.println("Введите число:"); if(sc.hasNextDouble()) { return sc.nextDouble(); } else { System.out.println("Ошибка при вводе. Повторите ввод"); return getNumber(); } } public static char getOperation() { Scanner sc = new Scanner(System.in); System.out.println("Выберите номер операции:\n1 - прибавить\n2 - отнять\n3 - умножить\n4 - разделить"); int operationNumber = 0; if(sc.hasNextInt()) { operationNumber = sc.nextInt(); } else { System.out.println("Вы ввели не число! Повторите ввод!"); return getOperation(); } switch (operationNumber) { case 1: return '+'; case 2: return '-'; case 3: return '*'; case 4: return '/'; default: System.out.println("Неправильная операция! Повторите ввод!"); return getOperation(); } } public static double add(double num1, double num2) { return num1+num2; } public static double sub(double num1, double num2) { return num1-num2; } public static double mul(double num1, double num2) { return num1*num2; } public static double div(double num1, double num2) { if(num2 != 0.0) { return num1/num2; } else { System.out.println("На 0 делить нельзя!"); return Double.NaN; } } public static double calc(double num1, double num2, char operation) { switch (operation) { case '+': return add(num1, num2); case '-': return sub(num1, num2); case '*': return mul(num1, num2); case '/': return div(num1, num2); default: return Double.NaN; } } }<p>Не стоит пугаться, код не такой большой, как кажется. Особенно, если мы представим его схематически:</p>
22 <p>А теперь давайте на минуту забудем о нашем примере и ещё раз поговорим о том, как строится каждый метод.</p>
22 <p>А теперь давайте на минуту забудем о нашем примере и ещё раз поговорим о том, как строится каждый метод.</p>
23 <h2>Как строится метод?</h2>
23 <h2>Как строится метод?</h2>
24 <p>Вот наиболее простой метод:</p>
24 <p>Вот наиболее простой метод:</p>
25 <p>Что тут у нас? Правильно, снова знакомые слова: метод println(), а также<strong>int</strong>. Возможно, вы до сих пор не знаете, что такое<strong>void</strong>, но мы сейчас всё разжуём)):</p>
25 <p>Что тут у нас? Правильно, снова знакомые слова: метод println(), а также<strong>int</strong>. Возможно, вы до сих пор не знаете, что такое<strong>void</strong>, но мы сейчас всё разжуём)):</p>
26 <p>Очевидно, что<strong>myMethod</strong>не что иное, как название метода.</p>
26 <p>Очевидно, что<strong>myMethod</strong>не что иное, как название метода.</p>
27 <p>Оно должно быть уникальным, это важно. Когда название метода включает в себя несколько слов, их пишут по принципу<strong>CamelCase</strong>(CamelStyle). Надпись справа в круглых скобках - то, что наш метод принимает, то есть значения (параметры, атрибуты), которые мы можем применять внутри метода.</p>
27 <p>Оно должно быть уникальным, это важно. Когда название метода включает в себя несколько слов, их пишут по принципу<strong>CamelCase</strong>(CamelStyle). Надпись справа в круглых скобках - то, что наш метод принимает, то есть значения (параметры, атрибуты), которые мы можем применять внутри метода.</p>
28 <p>Чтобы наш метод выполнился, надо в скобках написать число (говоря Java-терминологией,<strong>передать значение в метод</strong>) типа int. Оно автоматом подставится в переменную х, после чего будет доступно внутри нашего метода. Число, которое метод принимает, называют<strong>параметром метода</strong>.</p>
28 <p>Чтобы наш метод выполнился, надо в скобках написать число (говоря Java-терминологией,<strong>передать значение в метод</strong>) типа int. Оно автоматом подставится в переменную х, после чего будет доступно внутри нашего метода. Число, которое метод принимает, называют<strong>параметром метода</strong>.</p>
29 <p>Что касается void, то это то, что метод возвращает:</p>
29 <p>Что касается void, то это то, что метод возвращает:</p>
30 <p>Под словом "возвращает" подразумевается, что после выполнения метода мы получим определённое число, строку либо другое значение, которое можно будет использовать в месте, где был вызван метод.</p>
30 <p>Под словом "возвращает" подразумевается, что после выполнения метода мы получим определённое число, строку либо другое значение, которое можно будет использовать в месте, где был вызван метод.</p>
31 <p>Перед значением, которое надо вернуть, пишут<strong>return</strong>. Учтите, что значение, возвращающее метод, должно иметь тот же тип, который записан перед его названием. В нашем случае это<strong>double</strong>. Таким образом, с консоли мы считываем именно nextDouble().</p>
31 <p>Перед значением, которое надо вернуть, пишут<strong>return</strong>. Учтите, что значение, возвращающее метод, должно иметь тот же тип, который записан перед его названием. В нашем случае это<strong>double</strong>. Таким образом, с консоли мы считываем именно nextDouble().</p>
32 <p>Что касается пресловутого<strong>void</strong>, то оно переводится как "пустота". Как вы уже догадались, в этом случае метод не должен ничего возвращать после выполнения кода. Пример такого метода - println(), используемый в System.out.println(). Метод просто выводит в консоль значение, и мы ничего ему не присваиваем.</p>
32 <p>Что касается пресловутого<strong>void</strong>, то оно переводится как "пустота". Как вы уже догадались, в этом случае метод не должен ничего возвращать после выполнения кода. Пример такого метода - println(), используемый в System.out.println(). Метод просто выводит в консоль значение, и мы ничего ему не присваиваем.</p>
33 <p>Условно говоря, можно сказать, что есть методы, что-либо возвращающие, и "войдовские" методы.</p>
33 <p>Условно говоря, можно сказать, что есть методы, что-либо возвращающие, и "войдовские" методы.</p>
34 <p>Вернёмся к нашему примеру структуры:</p>
34 <p>Вернёмся к нашему примеру структуры:</p>
35 <p>Мы видим, что метод, называемый myMethod(), принимает на вход число x, которое должно быть<strong>integer</strong>. При этом метод может принимать и несколько переменных (параметров), но возвращать лишь одну.</p>
35 <p>Мы видим, что метод, называемый myMethod(), принимает на вход число x, которое должно быть<strong>integer</strong>. При этом метод может принимать и несколько переменных (параметров), но возвращать лишь одну.</p>
36 <p>Когда мы хотим передать методу несколько параметров, то пишем пишите их через запятую:</p>
36 <p>Когда мы хотим передать методу несколько параметров, то пишем пишите их через запятую:</p>
37 <p>Выше, методу myMethod() было передано три параметра, а именно: 1) int x - какое-либо целочисленное число x; 2) String s - какая-то строка (слова либо фраза); 3) long l - какое-либо число l типа long.</p>
37 <p>Выше, методу myMethod() было передано три параметра, а именно: 1) int x - какое-либо целочисленное число x; 2) String s - какая-то строка (слова либо фраза); 3) long l - какое-либо число l типа long.</p>
38 <p>Кроме параметров, существует понятие "тело метода" (мы упоминали о нём в самом начале статьи). Здесь всё просто, ведь всё, написанное в фигурных скобках {}, и есть тело метода. И это не что иное, как код, который выполняет метод. В примере ниже тело метода содержит лишь одну строчку кода:</p>
38 <p>Кроме параметров, существует понятие "тело метода" (мы упоминали о нём в самом начале статьи). Здесь всё просто, ведь всё, написанное в фигурных скобках {}, и есть тело метода. И это не что иное, как код, который выполняет метод. В примере ниже тело метода содержит лишь одну строчку кода:</p>
39 System.out.println("You enterеd number " + x);<p>Это означает, что метод myMehod() просто выведет в консоль число, введенное пользователем.</p>
39 System.out.println("You enterеd number " + x);<p>Это означает, что метод myMehod() просто выведет в консоль число, введенное пользователем.</p>
40 <h2>Попрактикуемся</h2>
40 <h2>Попрактикуемся</h2>
41 <p>Что же, давайте вернёмся к нашей программе-калькулятору и разберём код по частям, чтобы узнать, что именно делает каждый метод. Начнём, разумеется, с метода main(), задающего общую логику:</p>
41 <p>Что же, давайте вернёмся к нашей программе-калькулятору и разберём код по частям, чтобы узнать, что именно делает каждый метод. Начнём, разумеется, с метода main(), задающего общую логику:</p>
42 public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); }<p>А теперь смотрите на картинку ниже. В зелёной рамке вы увидите, что включает в себя метод getNumber(), то есть его логику. В главном методе main() мы вызываем метод getNumber() дважды для того, чтобы получить от пользователя два введённых числа. 1-е из них мы записываем в переменную num1, 2-е - в переменную num2. Что касается метода getNumber(), то он возвращает число типа double, так как перед названием метода getNumber находится слово double. Кстати, именно поэтому и num1, и num2 тоже относятся к типу double.</p>
42 public class Calculator { public static void main(String[] args) { double num1 = getNumber(); double num2 = getNumber(); char operation = getOperation(); double result = calc(num1, num2, operation); System.out.println("Результат:" + result); }<p>А теперь смотрите на картинку ниже. В зелёной рамке вы увидите, что включает в себя метод getNumber(), то есть его логику. В главном методе main() мы вызываем метод getNumber() дважды для того, чтобы получить от пользователя два введённых числа. 1-е из них мы записываем в переменную num1, 2-е - в переменную num2. Что касается метода getNumber(), то он возвращает число типа double, так как перед названием метода getNumber находится слово double. Кстати, именно поэтому и num1, и num2 тоже относятся к типу double.</p>
43 <p>Что можно увидеть в данном методе?</p>
43 <p>Что можно увидеть в данном методе?</p>
44 public static double getNumber() { Scanner sc = new Scanner(System.in); System.out.println("Введите число:"); if(sc.hasNextDouble()) { return sc.nextDouble(); } else { System.out.println("Ошибка при вводе. Повторите ввод"); return getNumber(); } }<p>Ничего сложного нет: мы создаём Scanner, считывая число с консоли. Когда пользователь вводит не число, выведется сообщение об ошибке ввода, после чего мы заново вызовем тот же метод, попросив пользователя снова ввести число.</p>
44 public static double getNumber() { Scanner sc = new Scanner(System.in); System.out.println("Введите число:"); if(sc.hasNextDouble()) { return sc.nextDouble(); } else { System.out.println("Ошибка при вводе. Повторите ввод"); return getNumber(); } }<p>Ничего сложного нет: мы создаём Scanner, считывая число с консоли. Когда пользователь вводит не число, выведется сообщение об ошибке ввода, после чего мы заново вызовем тот же метод, попросив пользователя снова ввести число.</p>
45 <p>Идём дальше и вызовем метод getOperation() в главном методе main(). Этот метод ничего не принимает, зато возвращает char, который соответствует операции, необходимой к выполнению. Вы можете ознакомиться с логикой метода getOperation() в рамке:</p>
45 <p>Идём дальше и вызовем метод getOperation() в главном методе main(). Этот метод ничего не принимает, зато возвращает char, который соответствует операции, необходимой к выполнению. Вы можете ознакомиться с логикой метода getOperation() в рамке:</p>
46 <p>И здесь мы вызываем Scanner, а потом просим, чтобы пользователь ввёл номер операции (как вы помните, у нас их четыре).</p>
46 <p>И здесь мы вызываем Scanner, а потом просим, чтобы пользователь ввёл номер операции (как вы помните, у нас их четыре).</p>
47 <p>Здесь 2 уровня защиты. В первую очередь, мы проверяем, а ввёл ли пользователь число в принципе:</p>
47 <p>Здесь 2 уровня защиты. В первую очередь, мы проверяем, а ввёл ли пользователь число в принципе:</p>
48 if(sc.hasNextInt()) { operationNumber = sc.nextInt(); } else { System.out.println("Вы ввели не число! Повторите ввод!"); return getOperation(); }<p>Пусть ввёл. Но он же может набрать не цифру в диапазоне 1-4, а какой-нибудь другой параметр. Поэтому задействуем<strong>switch case</strong>:</p>
48 if(sc.hasNextInt()) { operationNumber = sc.nextInt(); } else { System.out.println("Вы ввели не число! Повторите ввод!"); return getOperation(); }<p>Пусть ввёл. Но он же может набрать не цифру в диапазоне 1-4, а какой-нибудь другой параметр. Поэтому задействуем<strong>switch case</strong>:</p>
49 switch (operationNumber) { case 1: return '+'; case 2: return '-'; case 3: return '*'; case 4: return '/'; default: System.out.println("Неправильная операция! Повторите ввод!"); return getOperation(); }<p>Если всё правильно, метод вернёт char. В случае ошибки мы заново вызовем метод getOperation().</p>
49 switch (operationNumber) { case 1: return '+'; case 2: return '-'; case 3: return '*'; case 4: return '/'; default: System.out.println("Неправильная операция! Повторите ввод!"); return getOperation(); }<p>Если всё правильно, метод вернёт char. В случае ошибки мы заново вызовем метод getOperation().</p>
50 <p>Напоследок вызовем метод calc(). Он примет 3 параметра (2 числа double и операцию char), возвратив результат типа double:</p>
50 <p>Напоследок вызовем метод calc(). Он примет 3 параметра (2 числа double и операцию char), возвратив результат типа double:</p>
51 <p>Что касается метода calc(), то по сути он очень прост и состоит лишь из оператора switch case, "перенаправляющего" на другие методы:</p>
51 <p>Что касается метода calc(), то по сути он очень прост и состоит лишь из оператора switch case, "перенаправляющего" на другие методы:</p>
52 <p>Теперь, надеюсь, всё стало понятно! Вы можете скопировать разобранный по кирпичикам код и на своём компьютере увидеть, как на практике работают методы.</p>
52 <p>Теперь, надеюсь, всё стало понятно! Вы можете скопировать разобранный по кирпичикам код и на своём компьютере увидеть, как на практике работают методы.</p>
53 <h4>Делаем выводы:</h4>
53 <h4>Делаем выводы:</h4>
54 <ol><li>Мы можем писать собственные методы. Они могут быть с параметрами или без параметров, например: - getNumber() - это метод без параметров; - getOperation() - этот метод тоже без параметров; - calc(double num1, double num2, char operation) - а этот с параметрами.</li>
54 <ol><li>Мы можем писать собственные методы. Они могут быть с параметрами или без параметров, например: - getNumber() - это метод без параметров; - getOperation() - этот метод тоже без параметров; - calc(double num1, double num2, char operation) - а этот с параметрами.</li>
55 <li>Сначала мы прописываем логику каждого метода отдельно. После этого каждый метод вызываем в главном методе main().</li>
55 <li>Сначала мы прописываем логику каждого метода отдельно. После этого каждый метод вызываем в главном методе main().</li>
56 </ol>
56 </ol>