Понятие метода. Общая форма. Параметры метода. Возврат из метода. Оператор return. Примеры методов

Понятие метода. Общая форма. Параметры метода. Возврат из метода. Оператор return. Примеры методов


Содержание



1. Понятие метода. Определение метода в классе

Как известно, классы могут содержать данные и методы. В Java данные еще называют переменные экземпляра или объекты. Методы еще называются подпрограммы или функции. Метод – это подпрограмма обозначенная именем. по эту имени можно вызывать код подпрограммы (код метода). Вызов метода по имени может осуществляться из другого метода многократно в зависимости от выполняемой задачи. При каждом вызове имени метода вместо этого имени выполняется код метода.

Методы в классе – это именованный программный код, который определяет некоторую работу над данными класса. Класс может содержать любое количество методов. Кроме того, класс может быть реализован без методов. Чаще всего методы класса обрабатывают данные (переменные экземпляров) класса.

2. Параметры методов. Возврат значений из методов

Методы могут получать параметры. По количеству получаемых параметров методы делятся на:

  • методы, получающие параметры (методы с параметрами или параметризированные методы). В этом случае, перечень параметров указывается в скобках после имени метода;
  • методы без параметров. В этом случае после имени метода указываются пустые круглые скобки ( ).

Более подробно о параметрах методов описывается в следующей теме:

Метод может возвращать значение. Перед именем метода указывается тип значения, которое метод возвращает. С точки зрения возвращения значения из метода, методы могут быть двух видов:

  • методы, возвращающие значение. В этом случае метод должен содержать оператор return с кодом возврата;
  • методы, которые не возвращают значения. Перед именем метода, который не возвращает значение, указывается ключевое слово void. В этом случае метод не обязательно должен содержать оператор return. Если такой метод содержит оператор return, то после этого оператора ничего уже не указывается.

3. Общая форма объявления метода возвращающего значение

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

Общая форма объявления метода, который возвращает значение и получает параметры, имеет следующий вид:

return_type MethodName(type1 param1, type2 param2, ..., typeN paramN) {
    // тело метода - программный код метода
    // ...
}

где

  • MethodName – имя метода;
  • return_type – тип, возвращаемый методом. Это может быть примитивный (простой) тип, или тип (класс) объявленный дополнительно в программе;
  • param1, param2, paramN – имена параметров, которые имеют соответственно типы type1, type2, typeN. Количество параметров у методов может быть произвольным. Кроме того, параметры могут отсутствовать. Если метод не содержит параметров, то вместо списка параметров указываются пустые скобки ( ).

Если метод возвращает значение и не получает параметров, то общая форма такого метода следующая:

return_type MethodName() {
    // тело метода
    // ...
}

4. Методы, которые не возвращают значение. Общая форма. Ключевое слово void

Если метод не возвращает значения, то перед его объявлением указывается ключевое слово void. Такой метод не может использоваться в выражениях. Так, в языке программирования Паскаль, методы, которые не возвращают значение имеют название процедуры.

Общая форма объявления метода, который не возвращает значения но получает параметры имеет вид:

void MethodName(type1 param1, type2 param2, ..., type param) {
    // тело метода - программный код метода
    // ...
}

где

  • void – зарезервированное ключевое слово (спецификатор), указывающий на то, что метод не возвращает никакого значения;
  • MethodName – имя метода;
  • param1, param2, paramN – имена параметров, которые имеют соответственно типы type1, type2, typeN.

Если метод не возвращает значения и не получает параметров, то общая форма такого метода следующая:

void MethodName() {
    // тело метода
    // ...
}

5. Примеры методов, которые не получают параметры и не возвращают значения

Пример 1. Объявляется метод без параметров с именем MethodWithoutParameters(). Ключевое слово void указывает на то, что метод не возвращает значения

// метод, который не получает параметров и не возвращает значения
void MethodWithoutParameters() {
    return;
}

Такой метод можно записать и по другому

// оператор return необязателен
void MethodWithoutParameters() {

}

Пример 2. Демонстрируется реализация метода ShowInfo() в классе DemoMethods, который выводит информацию о Web-ресурсе. 

class DemoMethods {
    // метод, который выводит общую информацию о данном Web-ресурсе
    void ShowInfo() {
        System.out.println("Website Information:");
        System.out.println("Main page: https://www.bestprog.net");
        System.out.println("Programming: theory and practice");
        System.out.println("The website was created on December 08, 2015");
    }
}

Использование метода ShowInfo() класса DemoMethods в другом коде может быть следующим:

// использование метода ShowInfo() класса DemoMethods
DemoMethods dm = new DemoMethods();    // создать экземпляр класса
dm.ShowInfo(); // вызвать метод

В результате вызова метода в консоли будет выведен следующий результат:

Website Information:
Main page: https://www.bestprog.net
Programming: theory and practice
The website was created on December 08, 2015

6. Примеры методов, которые не получают параметров и возвращают значение

Пример 1. В классе MathConstants объявляется метод Pi(), возвращающий значение числа π. Метод Pi() возвращает значение типа double с помощью оператора return.

// класс, который содержит метод без параметров, который возвращает значение
class MathConstants {
    // метод, который возвращает число Пи
    double Pi() {
        return 3.1415926535;
    }
}

Ниже демонстрируется использование метода Pi() для вычисления площади круга:

// использование метода Pi() класса MathConstants
MathConstants mc = new MathConstants();
double area, radius;
radius = 2; // вычислить площадь круга радиуса 2
area = mc.Pi() * radius * radius; // area = 12.566370614

Пример 2. Объявляется класс Circle, содержащий внутренние данные (x, y, radius) и методы Area(), LenOrigin() которые выполняют над этими данными вычисления

// класс, реализующий окружность
class Circle {
    double x, y; // координаты центра окружности
    double radius; // радиус окружности

    // метод, возвращающий площадь круга радиуса radius
    double Area() {
    final double pi = 3.141592f; // константа Пи
    return pi * radius * radius;
    }

    // метод, возвращающий расстояние от центра окружности (x,y) до начала координат (0; 0)
    double LenOrigin() {
        double len = Math.sqrt(x*x + y*y);
        return len;
    }
}

Использование класса Circle может быть следующим

// использование методов класса Circle
Circle cr = new Circle();
double area, length;

// заполнить экземпляр класса значениями
cr.x = 2.5;
cr.y = 4.2;
cr.radius = 3;

// вызов методов
area = cr.Area(); // площадь окружности, area = 28.274328231811523
length = cr.LenOrigin(); // length = 4.887739763939975

7. Примеры методов, которые получают параметры и не возвращают значения

Пример 1. В примере объявляется класс Month, реализующий месяц года. В классе реализован метод SetMonth(), получающий входным параметром номер месяца. Метод SetMonth() не возвращает значения. В зависимости от номера месяца метод устанавливает следующие внутренние переменные:

  • номер месяца month;
  • количество дней в месяце days;
  • название месяца name.

Объявление класса Month следующее:

// класс, реализующий месяц года
class Month {
    int month; // номер месяца в году 1..12
    int days; // максимальное количество дней в месяце
    String name; // название месяца

    // метод, который устанавливает новый месяц по его номеру
    void SetMonth(int _month) {
        // проверка, корректны ли данные
        if ((_month<1)||(_month>12))
            return;

        // номер месяца
        month = _month;

        // количество дней в месяце
        switch (_month) {
            case 2:
                days = 29;
            break;
            case 4: case 6: case 9: case 11:
                days = 30;
            break;
        default:
            days = 31;
        }

        // название месяца
        switch (_month) {
            case 1: name = "Jan"; break;
            case 2: name = "Feb"; break;
            case 3: name = "Mar"; break;
            case 4: name = "Apr"; break;
            case 5: name = "May"; break;
            case 6: name = "Jun"; break;
            case 7: name = "Jul"; break;
            case 8: name = "Aug"; break;
            case 9: name = "Sep"; break;
            case 10: name = "Oct"; break;
            case 11: name = "Nov"; break;
            case 12: name = "Dec"; break;
            default: name = "";
        }
    }
}

Демонстрация использования метода следующая:

// демонстрация метода, который получает параметры и не возвращает значения
Month mn = new Month(); // создать экземпляр класса
mn.SetMonth(5); // установить данные для месяца "Май"

// проверка
int days;
String name;
days = mn.days; // days = 31
name = mn.name; // name = "May"

Пример 2. В классе Circle объявляется перегруженный метод SetData(), который устанавливает значение внутренних переменных экземпляра. Метод не возвращает значения – перед именем метода указывается ключевое слово void. Метод SetData() имеет две реализации:

  • реализация SetData(double, double, double). Метод получает 3 параметра типа double которые устанавливают значения соответствующих внутренних переменных класса;
  • реализация SetData(Circle). В этом случае метод получает экземпляр такого же класса в качестве источника данных.
// класс, реализующий окружность
class Circle {
    double x, y; // координаты центра окружности
    double radius; // радиус окружности

    // метод, который получает 3 параметра типа double
    // метод не возвращает значения (void)
    void SetData(double x, double y, double radius) {
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    // метод, который получает экземпляр типа Circle
    // метод не возвращает значения
    void SetData(Circle cr) {
        x = cr.x;
        y = cr.y;
        radius = cr.radius;
    }
}

8. Примеры методов, которые получают параметры и возвращают значение

Пример 1. Разработать методы в классе, которые решают следующую задачу. По данным числам a, b вычислить:

u = f(0.5, a) + f(2·a+2·b, a-2·b)

если

f(x, y) = x2 + x·y - y2

Для решения данной задачи объявляется класс с именем Solution. В классе реализованы два метода:

  • метод с именем f(), принимающий два параметра типа double. Этот метод реализует функцию f();
  • метод с именем u() без параметров, который вызывает функцию f() для возврата результата.

Реализация класса Solution следующая

// решение задачи
class Solution {
    // метод, который реализует функцию f(x,y)
    double f(double x, double y) {
        return x*x+x*y-y*y;
    }

    // метод, который реализует функцию u(a,b)
    double u(double a, double b) {
        return f(0.5, a) + f(2*a+2*b, a-2*b);
    }
}

Использование класса Solution в некотором методе

// использование методов класса Solution
Solution sl = new Solution();
double res;
res = sl.u(3,7); // res = 51.75

Пример 2. Объявляется класс Line, который реализует методы для работы с отрезком, заданным координатами (x1, y1), (x2, y2). В классе реализованы два метода IsLine() и Length(). Каждый из методов получает 4 параметра и возвращает значение.

Реализация класса следующая

// класс, содержащий методы работы с отрезком,
// который задан координатами его точек (x1,y1) и (x2,y2)
class Line {
    // метод, который определяет, образовывают ли координаты точек (x1,y1) и (x2,y2) отрезок
    boolean IsLine(double x1, double y1, double x2, double y2) {
        if ((x1==x2)&&(y1==y2)) return false;
        return true;
    }

    // метод, который определяет длину отрезка по его координатам
    double Length(double x1, double y1, double x2, double y2) {
    double len;
    len = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    return len;
    }
}

Ниже приведен фрагмент кода, который демонстрирует использование методов класса Line

// использование методов класса Line
Line ln = new Line();
double x1, y1, x2, y2;
double len = 0;

// ввод данных
x1 = 3.5; y1 = 2.8;
x2 = 7.2; y2 = 7.8;

// вычисление
if (ln.IsLine(x1, y1, x2, y2))
len = ln.Length(x1, y1, x2, y2); // Length = 6.220128616033595

9. Может ли тело метода быть пустым?

Тело метода может быть пустым, то есть не содержать ни единого оператора. Методы без операторов могут использоваться как методы-заглушки, которые на данный момент не содержат кода, но в которые в дальнейшем может быть вписан необходимый код.

10. Каким образом имя метода используется в выражениях? Пример

Имя метода может использоваться в выражениях. Чтобы имя метода использовалось в выражениях, этот метод должен возвращать значение с помощью оператора return. Тип возврата из метода будет типом имени метода, который используется в выражении. Нельзя использовать в выражении метод, который возвращает тип void.

Пример. Пусть определен метод с именем p(), который вычисляет следующее выражение p(x) = 3x³+2x²+x. Реализация метода следующая:

// метод, который вычисляет значение некоторого выражения
// на основе входного значения x
static double p(double x)
{
    return 3*x*x*x+2*x*x+x;
}

Тогда, имя метода p() может использоваться для вычислений в разных выражениях. Например

// использование имени метода в выражении
double res;
double a, b, c, d;

a = 2.5;
b = 3.2;
c = -1.8;
d = 14.2;

// имя метода p() используется в выражении
res = (p(a) + p(b) + p(c) + p(d)) / 4; // res = 43107.70404999999

В вышеприведенном коде, имя метода p() используется для вычисления выражения:

y = (p(a) + p(b) + p(c) + p(d))/4

где a, b, c, d – некоторые входные значения.

11. Какое назначение оператора return? Общая форма оператора return. Возврат из метода. Примеры

Оператор return используется для возврата значения из метода. Оператор return может иметь две формы применения. В первом случае общая форма оператора return имеет вид:

return expression;

где expression – некоторое выражение, переменная или константа. Эта форма применения используется, когда метод возвращает значение. Имя такого метода может использоваться в выражениях, если тип expression поддерживает такое применение.

Вторая форма оператора return следующая:

return;

В этом случае оператор return указывается в методе, который не возвращает никакого значения. Такой метод возвращает тип void.

Пример 1. Демонстрируется использование оператора return в методе, который возвращает результат типа double

// метод, который определяет максимальное значение между тремя числами
static double Max(double a, double b, double c) {
    double max = a;
    if (max<b) max=b;
    if (max<c) max=c;
    return max; // оператор return возвращает тип double
}

Пример 2. Демонстрируется возврат ссылки на объект класса из метода оператором return.

Пусть задан класс A

// некоторый класс
class A {
    int a;
}

Ниже реализован метод, который создает объект класса A. Выделяется память для объекта и ссылка на этот объект с помощью оператора return.

// метод, который создает объект класса A
static A CreateObj() {
    A obj = new A(); // создать объект (экземпляр) класса A
    obj.a = 5;
    return obj; // возвратить объект класса A из метода
}

Использование метода CreateObj() может быть следующим

// использование метода в другом коде
A obj;
obj = CreateObjA(); // obj.a = 5

Пример 3. Демонстрируется использование оператора return из метода, который не возвращает никакого значения.

// метод, который ничего не возвращает
void NoReturn() {
    return;
}

12. Какие ошибки программирования могут возникнуть при неправильном применении оператора return?

Если метод возвращает значение некоторого типа кроме void, то действуют следующие правила:

  • в теле метода обязательно должен быть оператор return который возвращает значение. Если в некоторой ветви выполнения метода оператор return будет отсутствовать, то компилятор выдаст сообщение об ошибке;
  • в теле метода, возвращающего значение (кроме void), любая ветвь выполнения должна завершаться оператором return. Иначе, компилятор выдаст сообщение об ошибке;
  • код тела метода должен быть построен таким образом, чтобы при выполнении некоторой ветви метода оператор return следовал последним. Если после return указать еще какой-либо программный код, то компилятор выдаст ошибку «Unreachable code» – «Недоступный код».

13. Обязательно ли использовать оператор return, если метод не возвращает значения?

Нет, не обязательно.


Связанные темы