Методи. Передача параметрів у методах (функціях) класу. Передача змінних простих типів та об’єктів у метод в якості параметра

Методи. Передача параметрів у методах (функціях) класу. Передача змінних простих типів та об’єктів у метод в якості параметра


Зміст



1. Які є способи передачі аргументів методу (функції)?

Для того, щоб передати змінну або об’єкт класу у функцію, у мові Java використовуються 2 способи:

  • передача за значенням. У цьому випадку значення аргументу копіюється у формальний параметр функції. Оскільки створюється копія аргументу в функції, то всі зміни над копією не вплинуть на значення аргументу;
  • передача за посиланням (адресою). У цьому випадку параметру передається посилання на аргумент, що використовується при виклику. За цим посиланням є доступ до аргументу. Таким чином, усі зміни, зроблені в тілі функції над значенням параметру, будуть змінювати значення аргументу що передавався у функцію.

2. Які особливості передачі аргументу примітивного типу?

Якщо методу передається аргумент примітивного типу, то відбувається передача за значенням. Тобто, робиться копія аргументу.

3. Яким чином в метод передається об’єкт деякого класу?

На відміну від змінних примітивних типів, об’єкти класу передаються за посиланням. Це означає, що зміни, які зроблені в тілі функції (методу) будуть змінювати також значення об’єкту, що задавався в якості аргументу.

4. Приклади передачі змінних примітивних типів у методи (функції)

Приклад 1. Реалізація методу Max(), що отримує два параметри примітивного типу.

static int Max(int a, int b)
{
    if (a>b) return a;
    else return b;
}

Демонстрація використання методу в іншому методі:

public static void main(String[] args)
{
    int t, x, y;
    x = 133;
    y = 68;
    t = Max(x, y); // t = 133
    System.out.println("Max = " + t);
}

Приклад 2. Реалізація методу Inc(), який збільшує (зменшує) значення цілочисельної величини value на значення вхідного аргументу step. У тілі методу змінюється значення параметру value. Однак, після завершення методу значення аргумету x у функції main() залишається без змін. Це означає, що відбулася передача параметру за значенням.

Реалізація методу має наступний вигляд:

static int Inc(int value, int step)
{
    value += step;
    return value;
}

Демонстрація використання методу Inc() у методі main():

public static void main(String[] args)
{
    int t, x;
    x = 13;
    t = Inc(x, 5); // t = 13+5 = 18; x = 13 - без змін
    System.out.println("t = " + t);
    System.out.println("x = " + x);
}
5. Приклад передачі об’єкту класу в метод (функцію)

У прикладі реалізується клас Month, що визначає місяць року. У класі оголошується:

  • внутрішня змінна month;
  • три конструктори;
  • три методи доступу.

В один з конструкторів класу передається об’єкт класу для початкової ініціалізації. Також об’єкт класу Month передається в один з методів SetMonth().

Програмний код, що реалізує клас Month має вигляд:

public class Month
{
    private int month;

    Month() { month = 1; }
    Month(int nmonth) { month = nmonth; }
    Month(Month mn) { month = mn.month; }

    // методи доступу
    int GetMonth() { return month; }
    void SetMonth(int month) { this.month = month; }
    void SetMonth(Month mn) { month = mn.month; }

    public static void main(String[] args)
    {
        Month m1 = new Month(); // конструктор без параметрів
        Month m2 = new Month(5); // конструктор з 1 параметром типу int
        Month m3 = new Month(m2); // конструктор з 1 параметром, який є об'єктом класу Month
        int t;
        t = m1.GetMonth(); // t = 1
        t = m2.GetMonth(); // t = 5
        t = m3.GetMonth(); // t = 5

        // передача об'єкту класу в метод SetMonth()
        m1.SetMonth(m2);
        t = m1.GetMonth(); // t = 5

        m2.SetMonth(8);
        m1.SetMonth(m2);
        t = m1.GetMonth(); // t = 8
        System.out.println("Month = " + t);
    }
}
6. Яким чином здійснюється повернення об’єкту класу з методу оператором return? Приклад

Крім примітивних типів даних методи (функції) можуть повертати об‘єкти класу. У цьому випадку, в тілі методу виділяється пам‘ять на об‘єкт класу. Після використання цей об‘єкт повертається з методу з допомогою оператора return.

У викликаючій частині програми не потрібно виділяти пам‘ять для об‘єкту, якому присвоюється повернуте значення з функції. Це пояснюється тим, що пам‘ять для всіх об‘єктів у програмі викликається динамічно. Поки існує посилання на об‘єкт, він не знищується з пам‘яті. Отже, при виконанні присвоєння виду:

varObj = Method(...);

буде існувати посилання на пам‘ять, виділену динамічно всередині методу Method(). Таким чином, для змінної-об‘єкту varObj не потрібно виділяти пам’ять у викликаючому коді.

Приклад. Нехай задано клас MyDay, що реалізує день тижня.

public class MyDay
{
    private int day; // внутрішня змінна day = 1..7

    // методи доступу
    public int GetDay() { return day; }
    public void SetDay(int nday) { day = nday; }
}

public class CDay
{
    // метод, що повертає об'єкт класу MyDay
    public static MyDay GetObjDay(int day)
    {
        MyDay tmpObj = new MyDay(); // пам'ять виділяється динамічно
        tmpObj.SetDay(day);
        return tmpObj; // повернення з методу: у викликаючому коді не потрібно виділяти пам'ять
    }

    public static void main(String[] args)
    {
        MyDay d = new MyDay(); // об'єкт класу MyDay - виділяється пам'ять
        MyDay d2; // пам'ять не потрібно виділяти

        d2 = GetObjDay(5); // d2 посилається на пам'ять, що виділена у методі GetObjDay()
        int t = d2.GetDay(); // t = 5

        System.out.println("Day = " + t);
    }
}

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