Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Модуль 3. Урок 2. Аргументы и результаты работы методов. Рефакторинг.

Из чего состоит метод — было рассказано в предыдущем уроке. Углубимся в некоторые детали.

Аргументы методов.

Часто аргументы называют параметрами метода.

Аргументы метода — это те данные с которыми метод будет работать. Они могут быть любого типа.

Уверен, Вы подметите, что метод может работать и с полями класса. Но поля класса видны всем остальным членам класса, а аргументы текущего метода видны только в рамках тела этого метода.

Рассмотрим на таком примере:

public class Foo {
    String message = "Сообщение из поля класса.";

    void printExternalMessage(String message) {
        System.out.println(message);
        System.out.println(this.message);
    }

    void printInternalMessage() {
        System.out.println(message);
    }

    public static void main(String[] args) {
        Foo example = new Foo();
        example.printExternalMessage("Сообщение, которое передали в метод как аргумент.");
        example.printInternalMessage();
    }
}

В данном примере, метод printExternalMessage видит обе ссылки с именем message: поле класса и собственный аргумент. Ввиду коллизии имен приходиться использовать ключевое слово this, чтобы явно указать ссылку, к которой обращаемся в коде.

Метод printInternalMessage видит ссылку с именем message только как поле класса Foo. Но ничего не знает о ссылке с именем message, которая находиться внутри метода printExternalMessage. Как и о любых других локальных ссылках, которые могут быть объявлены в методе printExternalMessage.

Сколько у метода может быть аргументов?

Аргументов у метода может быть разное количество. Минимально — ноль. Такой метод ничего не принимает на вход. Обычно аргументы метода перечисляются через запятую: void methodName(Type1 arg1, Type2 arg2, int a, int b). Особенно если они разных типов.

У метода может быть переменное число аргументов. То есть, когда один и тот же метод может принимать то один, то два, то десять аргументов. Но эти аргументы должны быть строго одного типа! Обозначается это так: void methodName(Type1... argsName). Благодаря этому можно создать, например, метод sum который суммирует любое количество чисел (в пределах возможностей компьютера и типа int):

public static int sum(int... numbers) {
    int result = 0;
    for (int number : numbers) { // Этот код пройдется по всем числам и сложит их
        result = result + number;
    }
    return result;
}

Под капотом java превратит int... numbers в массив. С массивами Вы познакомитесь в четвертом модуле. Запоминайте эти базовые "пазлы" синтаксиса java. Постепенно они проявят общую картину.

Перегрузка методов.

Перегрузка методов — это объявление нескольких методов в одном классе с идентичными именами. Различия состоят только в количестве и/или типе аргументов в этих методах. Например:

public class Foo {
    void printSomething() {
        System.out.println("Сообщение из метода без аргументов.");
    }

    void printSomething(int number) {
        System.out.println(number);
    }

    void printSomething(String message) {
        System.out.println(message);
    }

    void printSomething(String message, int number) {
        System.out.println(message + number);
    }

    public static void main(String[] args) {
        Foo example = new Foo();
        example.printSomething();
        example.printSomething(9999);
        example.printSomething("Some message.");
        example.printSomething("Meaning of life: ", 42);
    }
}

Java распознает метод не только по идентификатору (имени) но и по аргументам.

Перегрузка методов — один из способов поддержки полиморфизма в Java.

Результаты работы метода.

Результатом работы метода является то, что он возвращает в место своего вызова. Например, метод int sum(int a, int b) обязан вернуть результат типа int. Результат работы этого метода можно использовать в месте вызова этого метода. Пример в коде:

public class Main {
    public static int sum(int a, int b) {
        return a + b;
    }

    // Используем результат работы метода sum в методе main.
    public static void main(String[] args) {
        System.out.println(sum(10, 10)); // Выводим на экран результат.
        int result = sum(2, 2); // Сохраняем результат в переменную.
        sum(50, 50); // Ничего не делаем с результатом (плохая практика, так ненужно делать).
    }
}

return

return — это ключевое слово, которое завершает работу метода именно в том месте, где оно написано в теле текущего метода. Кроме этого, return возвращает результат выражения, следующего за ним, в место откуда был вызван текущий метод. Например в коде:

public static int sum(int... numbers) {
    int result = 0;
    for (int number : numbers) { // Этот код пройдется по всем числам и сложит их.
        result = result + number;
    }
    return result;
}

метод будет завершен в конце, после всех обозначенных задач над ним, в теле этого метода. Но если мы поменяем расположение return в этом методе вот так:

public static int sum(int... numbers) {
    int result = 0;
    return result;
    for (int number : numbers) { // Этот код пройдется по всем числам и сложит их.
        result = result + number;
    }
}

, то метод sum будет всегда выдавать результат 0. А все что после слова return в его теле — будет просто игнорироваться.

Слово return можно применять и в void методах, для преждевременного завершения их работы, если нужно. Например так:

void printSomething() {
    System.out.println("Сообщение из метода без аргументов.");
    return; // Поскольку после return нет выражений — он просто завершит работу метода.
    System.out.println("Lost."); // До этой строчки кода исполнение не дойдет.
}

Полезные ссылки:

Группы для общения:


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».