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

Открыта

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

— Идет.

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

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

Пример
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);
   }
}
4
Задача
Java Syntax,  2 уровень,  7 лекция
Недоступна
Набираем код
Иногда думать не надо, строчить надо! Как ни парадоксально звучит, порой пальцы «запоминают» лучше, чем сознание. Вот почему во время обучения в секретном центре JavaRush вы иногда встречаете задания на набор кода. Набирая код, вы привыкаете к синтаксису и зарабатываете немного материи. А ещё — боретесь с ленью.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии (217)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Дима Кизилов4 уровень
четверг, 14:35
Не получается вести в поле ваш код постоянно подсвечивает красным.
Angelina Lemberg2 уровень, Москва
среда, 20:02
Почему здесь в примере не скобок {} после if и соответственно else, как далее требуется в задаче?
Александр4 уровень, Минск
позавчера, 15:04
потому-что после if и else следует по одной инструкции... но даже если и поставить {} ошибки не будет, просто разрешено в таких случаях (в случае одиночной инструкции) не ставить фигурные скобки... экономия времени
Елена 5 уровень
7 июня, 08:44
void - не возвращает ничего, соотвествественно - это не функция, а процедура. Функция(метод) - где вместо void указывается тип, всегда возвращает значение (return) указанного типа, это принципиальная разница.
zertalls4 уровень, Москва
9 июня, 07:24
вызвали метод print4, заслав на вход строку и получившийся результат вернули в main. в чем тогда разница между методами void и не void? речь изначально шла об этом.
krutiverti2 уровень, Москва
5 июня, 05:52
Господа специалисты, поясните пожалуйста по строке int c = a, d = b; зачем вводятся новые переменные?
Александр4 уровень, Минск
позавчера, 15:10
не специалист, но тут все просто, код зеленого цвета просто дублирует тело функции из левого окошка.. т.е. при вызове функции System.out.println("Minimum is "+ m); ,а вызываем мы ее, когда пишем букву m, в параметр с записывается значение a, в параметр d попадает значение b.. это как раз таки и показано зеленым цветом в окошке справа... как-то так...
zertalls4 уровень, Москва
4 июня, 17:03
ребят. по внятней можете объяснить, каким образом или в каких случаях void все-таки может возвращать значение. само определение void'а вносит недопонимание.
andrey4 уровень, Москва
6 июня, 08:38
В статье написано, что ключевое слово void - это как пустой тип - метод с указанием void не возвращает ничего. Чтобы было проще запоминать для себя непонятные ключевые слова и назначение, - переводите их в словаре на родной язык.
Александр4 уровень, Минск
позавчера, 15:17
если есть return и он равен чему угодно, только не 0, то в функции писать void нельзя, т.к. return нечто возвращает и это нечто обязательно имеет какой-то тип (int, bool, float...). а вот если пишем мы функцию, и итогом ее выполнения будет например System.out.println(...); либо return 0; либо return; то тип возвращаемого значения void
Семен Семеныч3 уровень, Харьков
26 мая, 15:19
Ссори нуб)))... насколько я понимаю программа доходит до строчки int m = min(a, b); и ползет проверять что там накарябано в этом ...min(a, b)... ну ок :)) а там у нас.... min(int c, int d).......Вопрос в том как происходит запаралеливание аргументов....автоматом ??? как компилятор определяет что int c это int a а не int b......??? (или первый второй) а если в метод засунуть с десяток аргументов??
ununnamed31 уровень, Киев
29 мая, 21:03
Этот метод называется конструктором. Понимает очень просто. Он просто вбивает числа в скобках по порядку.
Александр Коротеев2 уровень, Москва
17 мая, 11:55
все ли норм, если я читаю как Амиго понимает, а сам я запутался уже во всех этих функции, имя функции, переменная и прочее???
Margarita7 уровень, Минск
17 мая, 13:10
у меня аналогично. может потом станет понятней..будем надеяться
Alexey8 уровень, Санкт-Петербург
20 мая, 11:45
Если хотите, чтобы Вам дали ответ, задавайте вопрос в духе stackoverflow. Нужно конкретно и ясно излагать свой вопрос, тогда Вы получите хороший ответ. Вопросы типа "ничего не понял" как правило игнорируются участниками форумов. Если сейчас не поймете - потом не поймете :)
Kirill Kushnaryov8 уровень, Barnaul
20 мая, 15:26
Начни параллельно литературу для новичков читать (в конце первого уровня был список). Всё становится немного понятней.
Никита Бабченко4 уровень, Москва
23 мая, 19:14
Лучше сейчас разобраться, дальше понятнее становиться ничего не будет)
Margarita7 уровень, Минск
26 мая, 12:08
спасибо, да, я так и поступила.
Дмитрий2 уровень, Екатеринбург
4 мая, 13:03
Как может быть так, что c меньше d и дальше они равны, путем м2=с и м2=d. бред какой то
Danjoker3 уровень, Москва
11 мая, 09:26
Они не равны, = это присвоение. В случае если с < d m2 будет присвоено значение с, если наоборот то d
Евгений3 уровень, Киев
15 мая, 12:19
знак равенства вроде ==
MaksMU3 уровень, Минск
16 апреля, 17:09
почему Амиго только сейчас задаётся вопросом про тим void?) раньше его это не беспокоило?)
MaksMU3 уровень, Минск
16 апреля, 16:27
Объясните пожалуйста, вообще в чём смысл вызова второго метода (print4), я ведь мог написать String s = "I like to ...." и потом System.out.println(s); если можно то с каким-нибудь примером, ибо я завис на этих методах и дальше двигаться толком не могу
ununnamed31 уровень, Киев
18 апреля, 14:25
Твой код вывел бы 1 раз фразу. Код из примера делает это 4 раза.
qwaP15 уровень, Москва
2 мая, 15:07
Вопрос в том, что в данном случае, если тебе понадобится снова написать 4 одинаковые строки подряд ты будешь делать это вручную, а при реализации через метод print4, тебе просто понадобится передать в него агрумент(то есть ту переменную, которую надо вывести на экран 4 раза)
Gustav Adolf3 уровень, Москва
10 мая, 16:17
я лично так понял если переменную String s объявлять в методе и присваивать ей значение - она будет существовать только внутри метода. А тут она создается как аргумент метода, и теперь существует везде внутри метода https://javarush.ru/quests/lectures/questsyntax.level02.lecture04