Вызываем методы, возвращаем значение

Открыта

— Ладно, давай зайдем с другой стороны. Я тебе сейчас расскажу как работает вызов методов, а ты потом еще раз попробуешь пробежаться по предыдущей лекции, ок?

— Идет.

— Отлично, тогда я расскажу тебе о вызове функций/методов и возвращаемых ими значениях.

— Команды группируют в функции, чтобы потом можно было исполнять их единым блоком – как одну сложную команду. Для этого надо написать имя функции(метода) и в скобках после него перечислить значения-параметры.

Пример
package com.javarush.lesson2;
public class MethodCall
{
    public static void main(String[] args)
    {
         print4(“I like to move it, move it.);
    }

    public static void print4(String s)
    {
        System.out.println(s);
        System.out.println(s);
        System.out.println(s);
        System.out.println(s);
    }
}

— В примере выше мы написали функцию, которая выводит на экран переданную строку 4 раза. Затем мы вызвали функцию print4 в строке номер 6.

— Когда программа дойдет до выполнения строчки 6, она перескачет на строчку 9 – переменной s будет присвоено значение “I like to move it, move it.”

— Затем будут выполнены строки 11-14, и, наконец, функция завершится и программа продолжит работу со строчки номер 7.

— Ясно.

— В функцию можно не только передавать аргументы (параметры), функция еще может возвращать результат(значение) своей работы. Это делается с помощью ключевого слова return. Вот как это выглядит:

Пример 1.
Вычисление минимума из двух чисел.
public class MethodCall
{
   public static void main(String[] args)
   {
      int a = 5, b = 7;
      int m = min(a, b);
      System.out.println("Minimum is "+ m);
   }

   public static int min(int c, int d)
   {
      int m2;
      if (c < d)
           m2 = c;
      else
           m2 = d;

      return m2;
   }
}
Вот как это работает:
public class MethodCall
{
   public static void main(String[] args)
   {
      int a = 5, b = 7;
      int c = a, d = b;
      int m2;
      if (c < d)
           m2 = c;
      else
           m2 = d;

      int m = m2;
      System.out.println("Minimum is "+ m);
   }
}
2
Задача
Java Syntax,  2 уровень,  7 лекция
Недоступна
Набираем код
Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

— Похоже, начинаю понимать. Слева и справа написан один и тот же код. Просто слева он вынесен в отдельную функцию.

— Функция вычисляет какое-то значение и отдает его тем, кто ее вызвал с помощью команды return. По крайней мере, мне так кажется.

— В принципе верно.

— А что еще за тип void такой?

— Некоторые функции просто что-то делают, но никаких значений не вычисляют и не возвращают, как наш метод main(), например. Для них придуман специальный тип результата – void – пустой тип.

— А почему нельзя было просто ничего не указывать, раз функция ничего не возвращает?

— Вспомни, как объявляется любая переменная – «тип и имя». А функция – «тип, имя и круглые скобки». А имя функции и затем круглые скобки – это вызов функции!

— Т.е. было проще придумать «пустой тип», чем разделять функции на две категории – возвращающие значение и не возвращающие значение?

— Именно! Ты отлично соображаешь, мой мальчик.

— А как возвращать пустой тип?

— Никак. Вот как все это работает: когда Java-машина выполняет команду return, она вычисляет значение выражения, стоящего справа от слова return, сохраняет это значение в специальной части памяти и тут же завершает работу функции. А сохранённое значение использует как результат вызова функции в том месте, где её вызвали. Ты можешь увидеть это на примере вверху.

— Ты говоришь про то место, где int m = min(a,b) трансформировалось в m=m2?

— Да. После вызова функции всё продолжает работать так, как будто вместо неё на этом же месте был написан её результат. Прочитай эту фразу еще раз и посмотри на код последнего примера.

— По-моему это только кажется лёгким, а на самом деле – сложно. Я только чуть-чуть чего-то понял и всё.

— Ничего. С первого раза можно понять только то, что уже знаешь. Чем больше не понятно, тем сильнее ты влез в новую для тебя область. И тем круче будет результат. Со временем всё прояснится.

— Ну, если ты так говоришь, тогда поехали дальше.

Комментарии (237)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Сергей3 уровень, Москва
9 августа, 20:38
Не понимаю как в левом варианте 'm' поймёт, что ей нужно взять итоговое число из 'm2' после 'return', ведь мы нигде не прописывали что-то типа 'm=m2' ? Объясните пож, а то уже закипаю.
Blacit7 уровень
10 августа, 12:26
Смотри, друг, тут всё легко. Ключевой момент - это то, что в функциях мы можем называть переменные так, как МЫ пожелаем. Смотри, что получается. Мы передаем из main 2 переменные. В методе (функции) мы присваиваем эти переданные переменные, т.е. , если передаётся 5 и 7 То это означает, что в функции цифра 5 будет равно n, а 7 равна d. Дальше в методе мы работаем с КОПИЯМИ этих переменных. После этого возвращаем из метода то, что нам требовалось, в нашем случае - наименьший элемент, т.е. как и получается - нужно вернуть одно число. Про твой вопрос, что мы не прописывали, смотри внимательно на строку 6, где мы вызываем функцию и потом присваиваем результат из этой функции.
Сергей3 уровень, Москва
10 августа, 13:00
Спасибо, но всё равно не понял. Видимо нужно почитать книг, которые здесь уже советовали.
Валихан7 уровень, Санкт-Петербург
11 августа, 20:07
Сергей, int m = min(a, b) означает, грубо говоря, m = m2! return m2 означает грубо говоря min(a, b) = m2. Т. е. посредством return m2 на место min(a, b) ставится m2. В методе main ты вызываешь метод min и сообщаешь ему значения которые надо сравнить, метод min находит минимальное из этих значений и возвращает его в вызывающую часть программы. Смотри лекции, читай литературу о вызове методов и возврате значений.
MriN3 уровень, Владивосток
27 июля, 09:47
Я не понял почему во втором примере нужно объявлять m. Почему нельзя просто подставить в вывод на экран m2, которая объявлена раньше?
Alann5 уровень
27 июля, 19:58
Чтобы пример справа был полностью идентичен тому что слева. Слева System.out.println("Minimum is "+ m), справа сделали также, что бы было нагляднее.
Валихан7 уровень, Санкт-Петербург
11 августа, 20:17
Чтобы понятнее было, чтобы пример справа был полностью идентичен тому что слева. Вот слева было return m2, а справа это m = m2. Чтобы доходчиво показать как работает оператор возвращения значения return.
Artur Bulkaev3 уровень, Самара
22 июля, 23:44
Друзья, такой вопрос В коде справа, например, понятно как c и d принимают значение a и b. Путем присваивания их значений. А вот слева, как именно переменные c и d понимают, что им нужно принять значения a и b соответственно?
Дмитрий Умнов9 уровень, Ульяновск
23 июля, 11:51
В 6 строке, при вызове метода, фактическими аргументами этого метода выступают a и b, записаны в скобках. Их значения передаются c и d соответстевнно, при выполнении кода метода. int m = min(a, b);
Артем Сычев8 уровень
30 июня, 15:30
Все равно непонятно с Void ( System.out.println(s); - что это, если не возвращаемое значение?
Игорь9 уровень, Москва
30 июня, 16:05
https://coderanch.com/t/664024/java/Return-System-println нашел примерный ответ на этом сайте, но он на английском. Вот перевод одного из ответов: Это совсем не так. Программа ничего не возвращает. Он печатает строку «Hello World» в System.out, которая обычно связана с системной консолью. Итак, да, когда вы запустите свою программу, вы увидите строку «Hello World», отображаемую на консоли, но этого не произошло из-за возвращаемого значения, это произошло из-за того, что метод System.out.println () сделал, когда Вы назвали это в строке 2.
Артем Сычев8 уровень
30 июня, 16:30
Спасибо, теперь чуть понятнее)
Валихан7 уровень, Санкт-Петербург
11 августа, 20:20
void означает что метод никаких вычислений не производит и никаких значений не возвращает.
Игорь9 уровень, Москва
30 июня, 15:24
Ребят. Спрошу как смогу. Объясните моему мозгу, почему код пишется как бы не последовательно в лекции выше? - "В примере выше мы написали функцию, которая выводит на экран переданную строку 4 раза. Затем мы вызвали функцию print4 в строке номер 6." Мне бы было понятней если бы сначала написали в 6 строке, а позже вызвали. Что за особенность языка, я просто только вникаю))
Артем Сычев8 уровень
30 июня, 15:49
Я так понимаю что нет, разницы. где описывать функцию до вызова или после.
Игорь9 уровень, Москва
30 июня, 15:58
Ну если это так тогда более понятно)
Иван Карасев3 уровень
23 июня, 13:02
А дальше все задачи будут только за деньги??? То есть бесплатно можно только лекции читать? испортили проект...жаль
Дима Кизилов19 уровень
13 июня, 14:35
Не получается вести в поле ваш код постоянно подсвечивает красным.
Рустам5 уровень
18 июня, 10:58
Внимательно смотри, там все пробелы нужно учесть !
Алексей4 уровень, Москва
18 июня, 17:29
Обращай внимание на момент, когда поле становится красным - индикация появления расхождений с оригиналом. К примеру при печатании открывающейся фигурной скобки автоматически добавляется закрывающаяся и поле тут же краснеет, удали вторую и снова белеет, так проще искать ошибки на ходу. Если переписываешь все точно, удаляя автоматические дополнения, то поле будет белым до самого конца.
Angelina Lemberg3 уровень, Москва
12 июня, 20:02
Почему здесь в примере не скобок {} после if и соответственно else, как далее требуется в задаче?
Александр10 уровень, Минск
14 июня, 15:04
потому-что после if и else следует по одной инструкции... но даже если и поставить {} ошибки не будет, просто разрешено в таких случаях (в случае одиночной инструкции) не ставить фигурные скобки... экономия времени
Елена 5 уровень
7 июня, 08:44
void - не возвращает ничего, соотвествественно - это не функция, а процедура. Функция(метод) - где вместо void указывается тип, всегда возвращает значение (return) указанного типа, это принципиальная разница.
zertalls7 уровень, Москва
9 июня, 07:24
вызвали метод print4, заслав на вход строку и получившийся результат вернули в main. в чем тогда разница между методами void и не void? речь изначально шла об этом.
Ваня Петило17 уровень, Львов
17 июня, 08:12
void - та же функция. Она возвращает null, то есть "ничего".
krutiverti2 уровень, Москва
5 июня, 05:52
Господа специалисты, поясните пожалуйста по строке int c = a, d = b; зачем вводятся новые переменные?
Александр10 уровень, Минск
14 июня, 15:10
не специалист, но тут все просто, код зеленого цвета просто дублирует тело функции из левого окошка.. т.е. при вызове функции System.out.println("Minimum is "+ m); ,а вызываем мы ее, когда пишем букву m, в параметр с записывается значение a, в параметр d попадает значение b.. это как раз таки и показано зеленым цветом в окошке справа... как-то так...