Можно ли в Java сделать метод внутри метода?
Нельзя. А то что Вы тут пишите — это банальный вызов метода другого объекта. И в данном случае лучше иметь свой приватный метод.
31 янв 2017 в 7:18
@Sergey, формально — да. Но реально это именно то, о чём спрашивается 🙂
31 янв 2017 в 7:37
в общем то это все костыли (включая и ответы на enSO из комментария к вопросу). По факту язык не предоставляет возможности написать метод в методе и возможность такая кажется мне излишней, не смотря на уверения в комментариях в вопросе об обратном.
31 янв 2017 в 7:55
@pavlofff: Если это выглядит как метод и работает как метод, то почему это не метод? 🙂
31 янв 2017 в 9:13
@Sergey: Если вам нужна функциональность вложенного метода, а не шашечки, то вам должно быть всё равно, как именно оно реализовано. Выпирает оно или нет — вопрос доступного в языке синтаксического сахара. (Java традиционно бедна на сахар, вон даже лямбды комитет очень долго принимал.)
Java -методы
Вы можете передавать данные, известные как параметры, в метод.
Методы используются для выполнения определенных действий, и они также известны как функции .
Зачем использовать методы? Чтобы повторно использовать код: определите код один раз и используйте его много раз.
Создать метод
Метод должен быть объявлен внутри класса. Он определяется именем метода, за которым следуют круглые скобки () . Java предоставляет некоторые предопределенные методы, такие как System.out.println() , но вы также можете создавать свои собственные методы для выполнения определенных действий:
Пример
Создайте метод внутри Main:
public class Main < static void myMethod() < // code to be executed >>
Объяснение примера
- myMethod() это имя метода
- static означает, что метод принадлежит классу Main, а не объекту класса Main. Вы узнаете больше об объектах и о том, как получить доступ к методам через объекты позже в этом руководстве.
- void означает, что этот метод не имеет возвращаемого значения. Вы узнаете больше о возвращаемых значениях позже в этой главе.
Вызов метода
Чтобы вызвать метод в Java, напишите имя метода, за которым следуют две круглые скобки () и точка с запятой ;
В следующем примере myMethod() используется для печати текста (действия) при его вызове:
Пример
Внутри main вызовите myMethod() метод:
public class Main < static void myMethod() < System.out.println("I just got executed!"); >public static void main(String[] args) < myMethod(); >> // Outputs "I just got executed!"
Метод также может быть вызван несколько раз:
Пример
public class Main < static void myMethod() < System.out.println("I just got executed!"); >public static void main(String[] args) < myMethod(); myMethod(); myMethod(); >> // I just got executed! // I just got executed! // I just got executed!
В следующей главе « Параметры метода » вы узнаете, как передавать данные (параметры) в метод.
Java: Метод main
Возможно вы удивитесь, но на протяжении всех предыдущих уроков, мы создавали свой собственный метод. Каркас метода был заранее написан, а от вас требовалось добавить его тело. Практика выглядела так:
public class App < public static void main(String[] args) < // BEGIN // А здесь вы писали свой код // END >>
Зачем мы создавали метод? Java так устроена, что в ней невозможно выполнять код вне методов. Вы не можете просто написать код на уровне файла и запустить его. Компилятор выдаст ошибку:
// Файл с таким кодом не компилируется System.out.println("Хотя казалось бы");
А вот такой код уже сработает:
public class App < public static void main(String[] args) < System.out.println("Хотя казалось бы"); >>
В работе вы часто будете видеть примеры вне методов. Почему мы и другие так делают? Исключительно для удобства.
Если на каждую строчку добавлять обертку в виде класса и метода, то объем шума и материала вырастет значительно. Всегда учитывайте это, ведь создатели этих материалов рассчитывают на то, что вы понимаете как работает Java.
Видите код, который вызывается без методов, всегда добавляйте обертку, как показано выше. Тогда вы легко сможете запустить этот код, например, локально.
Метод main
Почему метод в наших примерах называется main ? Мы ведь могли написать какой-то такой пример:
public class App < // run - имя выбрано произвольно // имя может быть любым, как захочет автор кода public static void run() < // здесь какой-то код >>
Мы могли бы так сделать, и все бы работало, но есть один момент. В таком виде метод main , как мы его определяем, имеет особенное значение для Java.
Java автоматически его вызывает, когда программа запускается из консоли:
# В файле App находится класс с именем App java App.java # компилирует и запускает на исполнение # Внутри запустится метод App.main, если он определен
Любой другой метод автоматически не вызывается. Именно поэтому мы везде используем main , ведь так можно легко перенести код из тренажера к себе в редактор и запустить его на выполнение.
Обязательно ли его определять? Нет, Java не накладывает никакого ограничения на то, какие и сколько методов вы определите в классе.
Так же как и нет ограничения на количество и имена классов.
Для простоты мы всегда используем имя App , но в реальном коде вы встретите тысячи разных имен и классов. Правда с условием, что в одном файле находится ровно один класс:
class MySuperClassName < public static void oneMethod() < >public static void twoMethod() < >public static void threeMethod() < >>
Об этом мы поговорим в курсе по ООП в Java.
Главное, что нужно сейчас запомнить — любые статические методы вызываются через точку после имени класса, а сами вызовы происходят внутри других методов:
// Просто пример вызовов методов друг из друга class MySuperClassName < public static void oneMethod() < MySuperClassName.twoMethod(); >public static void twoMethod() < MySuperClassName.threeMethod(); >public static void threeMethod() < >>
Задание
Реализуйте класс с именем App и двумя методами:
- Метод gogo() , который печатает на экран строку It works!
- main() , как в определении выше, который вызывает метод gogo()
Результат вызова main() в таком случае будет таким:
// => "It works!"
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Методы в Java
Привет! Это статья про основу основ Java и программирования вообще — про методы. В данной статье мы поэтапно объясним что такое методы в Java и зачем они нужны на конкретном примере. А в конце статьи Вы найдете ссылку на задачи, чтоб закрепить полученные знания на практике
Что такое метод?
Любой код на Java, который Вы откроете, будет состоять из методов. Можно сказать, это строительные «блоки», из которых состоит программа:
Метод в двух словах
Если Вы видите в программе какое-то слово, а затем круглые скобки — значит это метод:
слово()
Например — это названия 4 методов:
println()
hasNextInt()
getNumber()
main()
Зачем же они нужны?
Давайте поясним на примере. Представьте, что мы пишем программу-калькулятор.

В упрощенном виде программа-калькулятор должна выполнять 4 базовые операции: сложение, вычитание, умножение и деление. Поэтому, если бы мы писали программу-калькулятор, мы бы попросили пользователя:
1. Ввести 2 числа
2. Ввести операцию: «+» для сложения, «-» для вычитания, «*» для умножение и «/» для деления
Поэтому мы бы написали следующий код:
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 ) ;
Обратите внимание: этот только часть кода программы, а именно главный метод main. Если Вы попытаетесь запустить данный код у себя на компьютере, получите ошибку. Полную версию кода мы покажем ниже.
Что мы тут видим? На самом деле, в каждой строчке выполняется метод:

Все, что подчеркнуто — методы. И да-да, main — это тоже метод! Если записать схематически, то получим:

Что делают все эти методы? Какая логика этого кода?
Давайте объясним это так. Каждый метод отвечает за какое-то действие:

Два типа методов
В коде Вы можете увидеть:
- методы, которые видите впервые — эти методы мы написали сами:
Таким образом, все виды методов в Java можно поделить на две категории:
1. Стандартные, то есть написанные в стандартных библиотеках Java. Просто берешь нужный метод и используешь.
2. Пользовательские, то есть методы, которые Вы сами написали.
Как методы располагаются в программе
Мы уже говорили, что метод — это «строительный блок» программы. Как же они располагаются в программе?
Схематически это можно показать так:

Но выше, когда мы показывали код программы калькулятор, у нас был только один метод — main(). Как мы писали, это была только часть кода. Давайте теперь покажем весь — только не пугайтесь
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 ( ) ;
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 ( ) ;
System . out . println ( "Вы ввели не число! Повторите ввод!" ) ;
return getOperation ( ) ;
switch ( operationNumber ) <
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 ;
System . out . println ( "На 0 делить нельзя!" ) ;
return Double . NaN ;
public static double calc ( double num1 , double num2 , char operation ) <
switch ( operation ) <
return add ( num1 , num2 ) ;
return sub ( num1 , num2 ) ;
return mul ( num1 , num2 ) ;
return div ( num1 , num2 ) ;
return Double . NaN ;
Много? Давайте представим этот код схематически:

А теперь на пару секунд отойдем от нашего примера и посмотрим, как строится каждый конкретный метод.
Как же строится метод?
Давайте посмотрим на самый простой метод:

Тааак, что мы тут имеем? Если присмотреться, мы видим знакомые слова — int, метод println(). Из незнакомого только слово void, с ним мы разберемся чуть позже:

Отлично! Половина есть Так что же все это значит?
Как Вы могли догадаться, myMethod — это название метода.

Название метода должно быть уникальным. Если название состоит из нескольких слов, напишите его, используя CamelCase (что такое «CamelCase» можно прочитать в данной статье).
То, что написано справа от метода в круглых скобочках — это то, что метод принимает. Иными словами — это значения, которые мы можем использовать внутри метода.

Таким образом для того, чтобы метод выполнился, ему нужно в скобочках записать число (в терминологии методов это называется «передать значение в метод») типа int. Таким образом оно автоматически подставится в переменную х и будет доступно внутри метода. Кстати, то, что метод принимает, в данном случае int x, называется параметром метода.
То, что записано перед названием метода, то есть перед myMethod , это то, что метод возвращает.

Что значит возвращает? «Возвращает» — это значит, что после того, как метод выполнился, мы можем получить определенное число, строчку или другое значение, которое нужно использовать в том месте, где метод вызван.

Таким образом, как видите, перед значением, которое нужно вернуть, пишется специальное слово return. Обратите внимание, что значение, которое возвращает метод, должно быть того же типа, который записан перед названием метода. В нашем случае double. Собственно говоря, поэтому мы считываем с консоли именно nextDouble().
А что же такое за слово void, которое записано в предыдущем примере перед названием метода? Перед названием метода записывается слово void (с англ. «пустота»), если метод не должен ничего возвращать. То есть метод выполнил код, а в место, где он вызван, он ничего не возвращает. Примером такого метода может быть метод println(), который мы используем в System.out.println(). Все, что нужно от метода, — это вывести в консоль значение. И все. Мы же ничему не присваиваем System.out.println() ? Нет. Таким образом можно отличать методы, которые что-то возвращают и «войдовские» методы:
- если вызов метода мы чему-то присваиваем — метод возвращает определенное значение
- если же просто вызываем метод в отдельной строчке — этот метод «войдовский»
Ок, это уяснили. Вернемся к нашему простому примеру.

То есть я — метод с названием myMethod(). Я принимаю на вход какое-то число x, которое обязательно должно быть integer.
Принимать метод может и несколько переменных или другими словами параметров, но возвращать — только одну:

Если Вы хотите передать несколько параметров методу — пишите их через запятую:

Как видите, мы передали методу myMethod() 3 параметра:
- int x — то есть какое-то число x, которое обязательно должно быть integer
- String s — какую-то строку (слово или фразу)
- long l — какое-то число l, которое должно быть long типа
Помимо параметров, есть еще такое понятие как «тело метода». С этим все просто: все, что написано в фигурных скобках <> — это тело метода. То есть это код, который должен выполнять метод. В данном примере в теле метода только 1 строчка кода:
- System.out.println(«You enterеd number » + x);
А значит метод myMehod() всего-навсего выводит в консоль введенное пользователем число.
На практике
Теперь давайте вернемся к нашему примеру — к огромному устрашающему куску кода, который мы показали чуть выше в этой статье Сейчас мы с Вами разберем по частям из чего состоит этот «устрашающий код» и тогда он покажется совсем не страшным.
Что делает каждый метод?
Начнем с метода main(), который задает общую логику нашей программы:
