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

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


Содержание



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);
    }
}


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