Поняття методу. Загальна форма. Параметри методу. Повернення з методу. Оператор 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, ..., typeN paramN) {
    // тіло методу - програмний код методу
    // ...
}

де

  • 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

// метод, що визначає максимальне значення між 3-ма числами
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 CreateObjA() {
    A objA = new A(); // створити об'єкт (екземпляр) класу A
    objA.a = 5;
    return objA; // повернути об'єкт класу A з методу
}

Використання методу CreateObjA() може бути таким

// використання методу в іншому коді
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, якщо метод не повертає значення?

Ні, не обов’язково.


Зв’язані теми