Методи. Передача параметрів у методах (функціях) класу. Передача змінних простих типів та об’єктів у метод в якості параметра
Зміст
- 1. Які є способи передачі аргументів методу (функції)?
- 2. Які особливості передачі аргументу примітивного типу?
- 3. Яким чином в метод передається об’єкт деякого класу?
- 4. Приклади передачі змінних примітивних типів у методи (функції)
- 5. Приклад передачі об’єкту класу в метод (функцію)
- 6. Яким чином здійснюється повернення об’єкту класу з методу оператором return? Приклад
- Зв’язані теми
Пошук на інших ресурсах:
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); } }
⇑
Зв’язані теми
- Типи даних Java
- Застосування класів у програмах на Java. Визначення класу та об’єкту класу. Приклади