Динамическое связывание в Java?

У меня есть небольшая путаница с динамическим связыванием в Java. Вот программа, я хочу знать, есть ли динамическое связывание или что-то еще. Что такое динамическая привязка на самом деле?

class A {
int a;

public A() {
    a = 9;
}

public void show() {
    System.out.print("show in A ; ");
    System.out.println("a : " + a);
}
}
public class B extends A {
public B() {
    a = 8;
}

public void show() {
    System.out.print("show in B ; ");
    System.out.println("a : " + a);
}

public static void main(String[] args) {
    B p = new B();
    p.show();

    A q = new B();
    q.show();
}
}

5 ответов

Решение

Я думаю, что я запутал вас ранее.

Динамическое (или позднее) связывание - это то, как полиморфизм реализуется в Java. Это происходит каждый раз, когда вызывается метод экземпляра.

В вашем примере нас интересуют события здесь

p.show();

и здесь

q.show();

Во время компиляции статический тип переменной будет проверен, чтобы увидеть, если метод show() доступно, в противном случае, если это не так.

Во время выполнения (динамическое) тип объекта (динамическое) будет проверяться, чтобы найти реализацию метода. Если он найден, он используется, если нет, JVM продолжает искать иерархию наследования.

Например

A q = new B();
q.show();

во время выполнения, q имеет тип B а также B Переопределение show() так B#show() вызывается.


В вашем ответе, который я прокомментировал, переопределенный метод не сыграл никакой роли. Это был скорее вопрос порядка выполнения конструктора.

Это здесь

 A q = new B();
 q.show();

Компилятор использует инструкции виртуального вызова (invokeVirtual или же invokeInterface) для методов, которые могут быть переопределены (они не могут быть статическими или частными). В этом коде JVM обнаруживает, что A.show является виртуальным и проверяет фактический тип q, Так как это B это вызывает B.show, Если бы это была статическая JVM A.show и мы увидим

show in A

Вы можете изменить его в своем основном методе для реализации полиморфизма или динамического связывания:

public static void main(String[] args) {
    A a = new A();       
    a.show();

    a = new B();       
    a.show();
}

как вы можете сказать, что даже ссылка никогда не меняется A a но то, на что оно ссылается, меняется, поскольку на это указывает другой случай, поведение различий будет сделано!
Это так называется polymorphism,

Много мощный полиморфизм, после использования reflect в Яве будет баловать вас! повеселись!

Метод show() вызывается в следующих строках

A q = new B();
q.show();

Целевой объект метода show определяется во время выполнения.

- Обязательный акт method call identifying and calling its method body,

- Java поддерживает только динамическое связывание, за исключением нескольких исключений.

- Компилятор не может понять, какой method call быть связанным с которым method body... так что ответственность за вызов метода связана с соответствующим телом метода.

- Очень важно знать, что Fields (Переменные экземпляра) НЕ ПОЛИМОРФНЫ В ПРИРОДЕ.

В вашем случае динамическая привязка здесь:

 A q = new B();
 q.show();
Другие вопросы по тегам