JavaRush/Java блог/Random UA/Відмінності між раннім та пізнім зв'язуванням у Java

Відмінності між раннім та пізнім зв'язуванням у Java

Стаття з групи Random UA
учасників
Щоб з'ясувати, в чому полягає відмінність між раннім (статичним) і пізнім (динамічним) зв'язуванням в Java, потрібно спочатку зрозуміти, що таке саме зв'язування . Зв'язування означає наявність зв'язку між посиланням та кодом. Наприклад, змінна, яку ви посилаєтеся, прив'язана до коду, у якому вона визначена. Аналогічно, метод, що викликається, прив'язаний до місця в коді, де він визначений.
Відмінності між раннім та пізнім зв'язуванням у Java - 1
Існує два типи зв'язування методів у мові Java: раніше зв'язування (його ще називають статичним) та пізніше (відповідно, динамічне) зв'язування. Виклик методу Java означає, що цей метод прив'язується до конкретного коду або в момент компіляції, або під час виконання, при запуску програми і створенні об'єктів. Можна зрозуміти з назви, статичне зв'язування має більш статичний характер, оскільки відбувається під час компіляції, тобто код «знає», який метод викликати після компіляції вихідного коду на Java у файли класів. А оскільки це стосується ранньої стадії життєвого циклу програми, то називається також раннім зв'язуванням (early binding). З іншого боку, динамічне зв'язування відбувається під час виконання після запуску програми віртуальною машиною Java. У цьому випадку те, який метод викликати визначається конкретним об'єктом, так що в момент компіляції інформація недоступна, адже об'єкти створюються під час виконання.
Отже, фундаментальна відмінність між статичним і динамічним зв'язуванням Java полягає в тому, що перше відбувається рано, під час компіляції на основі типу посилальної змінної, а друге - пізніше, під час виконання, з використанням конкретних об'єктів.
Давайте розглянемо ще кілька відмінностей, щоб краще розібратися з цим, а, крім того, можемо відповісти на це дуже популярне питання, яке ставлять на співбесідах з Java.

Раннє та пізнє зв'язування в Java

Існує безліч відмінностей статичного та динамічного зв'язування у мові Java, але найважливіше – те, як їх використовує JVM. Чи ви коли-небудь замислювалися, яким чином JVM вирішує, який метод викликати, якщо в області видимості міститься більше одного методу з одним ім'ям? Якщо ви коли-небудь використовували перевантаження або перевизначення методів, то знаєте, що Java може мати кілька методів з одним ім'ям. У випадку Java віртуальна машина JVM використовує як статичне, так і динамічне зв'язування для вибору потрібного методу.

Приклад статичного та динамічного зв'язування в Java

У цій програмі ви побачите, що прив'язка віртуальних методів не відбувається під час компіляції за допомогою статичного зв'язування, оскільки в цьому випадку викликався б метод із суперкласу, як відбувається зі статичними методами, які рано зв'язуються. Якщо буде викликаний метод підкласу, то для зв'язування функції використовувався конкретний об'єкт під час виконання, а, отже, для зв'язування віртуальних функцій використовується динамічне зв'язування.
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе об'єкта
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
Як бачите, виклик методу premium()призвів до виконання методу з підкласу, тоді як виклик методу category()призвів до виконання методу суперкласса. Це відбувається через те, що premium()– віртуальний метод, який дозволяється за допомогою пізнього зв'язування, тоді як category()– статичний метод, який дозволяється за допомогою статичного зв'язування під час компіляції на ім'я класу.
Цікаво читати про Java? Вступайте до групи Java Developer !

Відмінності між раннім та пізнім зв'язуванням у мові Java

Тепер, коли ви розібралися і розумієте, як у мові Java зв'язуються виклики методів і як функціонує статичне та динамічне зв'язування, давайте ще раз перерахуємо ключові відмінності між раннім та пізнім зв'язуванням у мові Java:
  1. Статичне зв'язування відбувається під час компіляції, динамічне – під час виконання.

  2. Оскільки статичне зв'язування відбувається на ранній стадії життєвого циклу програми його називають раннім зв'язуванням. Аналогічно динамічне зв'язування називають також пізнім зв'язуванням, оскільки воно відбувається пізніше, під час роботи програми.

  3. Статичне зв'язування використовується в мові Java для розв'язання перевантажених методів, в той час як динамічне зв'язування використовується в мові Java для вирішення перевизначених методів.

  4. Аналогічно, приватні, статичні та термінальні методи дозволяються за допомогою статичного зв'язування, оскільки їх не можна перевизначати, а всі віртуальні методи дозволяються за допомогою динамічного зв'язування.

  5. У разі статичного зв'язування використовуються не конкретні об'єкти, а інформація про тип, тобто виявлення потрібного методу використовується тип посилальної змінної. З іншого боку, при динамічному зв'язуванні для знаходження потрібного методу Java використовується конкретний об'єкт.
Ось непогана вправа, заснована на поняттях статичного та динамічного зв'язування у мові Java. Чи зможете ви відповісти на запитання: "Що буде виведено під час виконання наступної програми?"
Відмінності між раннім та пізнім зв'язуванням у Java - 2
Що виведе ця програма? Collection, Setчи HashSet? Ось і все, що ми хотіли розповісти вам про різницю між раннім (статичним) і пізнім (динамічним) зв'язуванням у мові Java. Це одне з найкращих питань для телефонної співбесіди з мови Java, оскільки вона надає багато можливостей перевірки глибини знань кандидата. Завжди пам'ятайте, що приватні , статичні та final-методи пов'язуються за допомогою статичного зв'язування , а віртуальні – динамічного . Аналогічно, найкращий приклад статичного зв'язування – навантаження методів, а перевизначення – динамічного. Джерело
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.