JavaRush /Java блог /Random UA /Кава-брейк #111. Поліморфізм та динамічне зв'язування в J...

Кава-брейк #111. Поліморфізм та динамічне зв'язування в Java. Цикл for Java + приклад синтаксису циклу forEach

Стаття з групи Random UA

Поліморфізм та динамічне зв'язування в Java

Джерело: DZone Поліморфізм – одна з основних концепцій об'єктно-орієнтованого програмування. Будь ви новачком у програмуванні на Java або розробник з великим досвідом роботи, ви повинні знати, що таке поліморфізм і як він працює. Більшість розробників стверджують, що добре розуміються на цій темі, але коли справа доходить до інших складних функцій, таких як статична та динамічна прив'язка, багато хто з них втрачає колишню впевненість. Кава-брейк #111.  Поліморфізм та динамічне зв'язування в Java.  Цикл for Java + приклад синтаксису циклу forEach - 1

Що таке поліморфізм у Java?

Поліморфізм означає наявність багатьох форм. У програмуванні це означає здатність сигналу або повідомлення відображатись більш ніж в одній формі.

Приклад із реального життя

Людина може виявляти безліч характеристик одночасно. Наприклад, мати може бути одночасно і дружиною, і дочкою, і сестрою, і співробітником компанії, і таке інше. Отже, людина може виявляти різні характеристики у різних умовах. Це відомо як поліморфізм.

Важливість поліморфізму

Поліморфізм - одна з найважливіших особливостей будь-якої об'єктно орієнтованої мови програмування (наприклад, Java). За допомогою поліморфізму те саме завдання можна виконувати різними способами.

Типи поліморфізму

У Java поліморфізм можна розділити на дві категорії:
  1. Поліморфізм часу компіляції (Compile-time, статичне зв'язування)
  2. Поліморфізм часу виконання (Runtime, динамічне зв'язування)

Поліморфізм часу компіляції

Поліморфізм часу компіляції також відомий як статичне зв'язування. Цей тип поліморфізму може бути досягнутий шляхом навантаження функцій або навантаження операторів. Але Java це обмежено перевантаженням функцій, оскільки Java не підтримує навантаження операторів. Перевантаження функцій Коли є принаймні дві функції або методу з однаковим ім'ям функції, але чи кількість параметрів, що містяться в них, різне, або хоча б один тип даних відповідного параметра відрізняється (або обидва), тоді це називається функцією або методом перевантаження, і ці функції відомі як перевантажені функції. Приклад 1 До цього часу ми вивчали, що таке навантаження функцій. Тепер спробуємо продемонструвати програмне навантаження функцій.
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    // Method 2
    // having the same name but with 2 double parameters
    static double Addition(double a, double b)
    {
        // Returns sum of double numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Запустити вказану вище програму ви можете тут . Пояснення програми:
  • Наведена вище програма складається з двох статичних функцій з однаковими іменами: Addition .

  • Тут обидві функції містять однакову кількість параметрів, але відповідні параметри різні.

  • Method 1 приймає два цілих параметри, тоді як Method 2 приймає два параметри типу double .

  • З основної функції ми спочатку викликаємо функцію Addition (12, 14) . Параметри, що передаються, є цілими числами (12 і 14), тому Method 1 будуть викликатися тут.

  • Потім ми викликали функцію Addition (15.2, 16.1) . Оскільки передані параметри мають подвійний тип даних (15.2 та 16.1), цього разу буде викликано Method 2 .

  • Саме так досягається перевантаження функцій Java на основі різних типів даних параметрів.

Приклад 2 Розглянемо програму, наведену нижче:
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }

    // Method 2
    // having the same name but with 3 integer parameters
    static double Addition(double a, double b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
Запустити вказану вище програму можна тут . Пояснення програми:
  • Наведена вище програма складається із двох статичних функцій з однаковими іменами: Addition .

  • Тут обидві функції містять різну кількість параметрів, але тип даних перших двох відповідних параметрів однаковий (цілочисленний).

  • Method 1 приймає два цілих параметри, а Method 2 приймає три параметри цілочисельного типу даних.

  • З основної функції ми спочатку викликаємо функцію Addition(2, 3) . Оскільки передані параметри є цілими числами (2 та 3), вони викликатимуть тут Method 1 .

  • Потім ми викликали функцію Addition(4, 5, 6) . Параметри, що передаються, є подвійними типами даних (4, 5, 6), тому цього разу вони будуть викликати Method 2 .

  • Так досягається перевантаження функцій Java на основі різної кількості параметрів.

Приклад 3
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {
        // Return the sum
        return a + b;
    }
    // Method 2
    // having the same name but with 3 parameters
    // 1st parameter is of type double and other parameters
    // are of type integer
    static double Addition(double a, int b,  int c)
    {
        // Return the sum
        return a + b + c;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(2, 4));
        System.out.println(Addition(4.2, 6, 10));

    }
}
Ви можете запустити вказану вище програму тут . Пояснення програми:
  • Наведена вище програма складається з двох статичних функцій з однаковими іменами: Addition .

  • Обидві функції містять різну кількість параметрів, і тип даних першого відповідного елемента також відрізняється.

  • Method 1 приймає два цілих параметри, тоді як Method 2 приймає три параметри - перший має тип double, а два інших - цілочисельні типи даних.

  • З основної функції ми спочатку викликаємо функцію Addition(2, 4) . Оскільки передані параметри є цілими числами (2 та 4), вони викликатимуть тут Method 1 .

  • Потім ми викликали функцію Addition(4.2, 6, 10) . Перший переданий параметр має цілий тип, а інші параметри мають тип даних double (4.2, 6, 10), тому цього разу буде викликаний Method 2 .

  • Ось як Java досягається перевантаження функцій з урахуванням різної кількості параметрів, і навіть різних типів даних відповідних параметрів.

Примітка. Функція не може бути перевантажена тільки на основі типу функцій, що повертається.

Поліморфізм часу виконання

Цей варіант також відомий як динамічний зв'язування. У цьому процесі виклик функції, створеної іншої функції, дозволяється лише під час виконання. Ми можемо досягти динамічного зв'язування Java за допомогою перевизначення методів.

Перевизначення методу

Перевизначення методу Java відбувається, коли метод у базовому класі має визначення у похідному класі. Метод чи функція базового класу називається перевизначеним методом.
// Class 1
class Parent {

    // Print method
    void Print()
    {

        // Print statement
        System.out.println("Inside Parent Class");
    }
}

// Class 2
class Child1 extends Parent {

    // Print method
    void Print() { System.out.println("Inside Child1 Class"); }
}

// Class 3
class Child2 extends Parent {

    // Print method
    void Print()
    {
        // Print statement
        System.out.println("Inside Child2 Class");
    }
}

class Main {

    public static void main(String args[]) {

        // Creating an object of class Parent
        Parent parent = new Parent();
        parent.Print();

        // Calling print methods
        parent = new Child1();
        parent.Print();

        parent = new Child2();
        parent.Print();
    }
}
Ви можете запустити вказану вище програму тут . Пояснення програми:
  • Вищезгадана програма складається з трьох класів: Parent ( class 1 ), Child1 ( class 2 ) та Child2 ( class 3 ). Class 2 та class 3 успадковують class 1 .

  • Parent має метод під назвою Print() . Усередині цієї функції ми друкуємо " Inside Parent Class ". Child1 і Child2 також мають функції Print() , які переважно перевизначають Print() функцію класу Parent і виводять " Inside Child1 Class " і " Inside Child2 Class " відповідно на консоль.

  • З основної функції ми спочатку створюємо об'єкт батьківського класу під назвою parent. Потім за допомогою цього об'єкта ми викликаємо метод друку класу parent . Тому " Inside Parent Class " буде виведено на консолі.

  • Після цього ми викликаємо конструктор класу Child1 за замовчуванням та викликаємо функцію Print() . Зверніть увагу, що тепер буде викликатися метод Print() , визначений у класі Child1 , оскільки ми перевизначабо метод Print() класу parent . Отже, " Inside Child1 Class " буде надруковано на консолі.

  • Нарешті ми викликали конструктор класу Child2 за замовчуванням і викликаємо функцію Print() . Тут буде викликатись метод Print() , визначений у класі Child2 , оскільки ми перевизначабо метод Print() класу parent . Отже, " Inside Child2 Class " буде надруковано на консолі.

  • Саме так досягається перевизначення методів Java.

Підсумки

У цій статті ми дізналися, що таке поліморфізм у Java. Потім ми заглибабося в тему та обговорабо два типи поліморфізму в Java: поліморфізм часу компіляції та поліморфізм часу виконання. За допомогою програм ми продемонстрували, як можна досягти статичного та динамічного зв'язування в Java.

Цикл for Java + приклад синтаксису циклу forEach

Джерело: FreeCodeCamp Цикл (Loop) у програмуванні - це послідовність інструкцій, які виконуються безперервно доти, доки не буде виконано певну умову. У цій статті ми дізнаємося про цикли for і forEach в Java. Кава-брейк #111.  Поліморфізм та динамічне зв'язування в Java.  Цикл for Java + приклад синтаксису циклу forEach - 2

Синтаксис циклу for в Java

Перед вами синтаксис створення циклу for :
for (initialization; condition; increment/decrement) {
   // code to be executed
}
Давайте розберемо деякі ключові слова, наведені в коді:
  • for показує, що ми збираємося створити цикл. За ним йдуть круглі дужки, в яких міститься все необхідне роботи нашого циклу.

  • Initialization визначає початкову змінну як початкову точку циклу, зазвичай ціле число.

  • condition вказує, скільки разів цикл повинен виконуватись.

  • increment / decrement збільшує/зменшує значення початкової змінної щоразу, коли запускається цикл. У міру збільшення/зменшення значення змінної прагне заданої умови.

  • Зверніть увагу, що кожне ключове слово відокремлюється крапкою з комою ( ; ).

Ось кілька прикладів:
for(int x = 1; x <=5; x++) {
  System.out.println(x);
}

/*
1
2
3
4
5
*/
У наведеному вище прикладі початкова змінна - це x зі значенням 1. Цикл буде продовжувати працювати до тих пір, поки значення x менше або дорівнює 5 - це умова. x++ збільшує значення x після кожного запуску. Ми продовжабо друкувати значення x , яке зупиняється після 5, тому що умова була виконана. Збільшення до 6 неможливе, тому що воно більше і не дорівнює 5. У наступному прикладі ми будемо використовувати цикл for для виведення всіх значень масиву.
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
  System.out.println(randomNumbers[i]);
}

// 2
// 5
// 4
// 7
Це майже те саме, що і в останньому прикладі. Тут ми використовували довжину масиву як умову та початкове значення змінної як нульове, тому що порядковий номер першого елемента масиву дорівнює нулю.

Синтаксис циклу forEach в Java

Цикл forEach використовується спеціально для перебору елементів масиву. Ось як виглядає його синтаксис:
for (dataType variableName : arrayName) {
  // code to be executed
}
Ви помітите, що синтаксис тут коротший, ніж у циклу for . І цикл forEach також починається з ключового слова for . Замість ініціалізації змінної значення ми спочатку вказуємо тип даних (він повинен відповідати типу даних масиву). Далі слідує ім'я нашої змінної та ім'я масиву , розділені двокрапкою. Ось приклад, який допоможе вам краще зрозуміти синтаксис:
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
  System.out.println(x + 1);
}

/*
3
6
5
8
*/
У цьому прикладі ми перебрали кожен елемент і збільшабо їхнє початкове значення на 1. За замовчуванням цикл зупиняється, як тільки він перебирає всі елементи масиву. Це означає, що нам не потрібно передавати будь-яке значення нашої змінної або вказувати будь-яку умову для завершення циклу.

Висновок

У цій статті ми дізналися, що таке цикли, а також синтаксис для створення циклів for і forEach в Java. Ми також побачабо кілька прикладів, які допомогли нам зрозуміти, коли та як їх використовувати. Вдалого кодування!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ