2014-01-06 7 views
0

У меня есть небольшая путаница с Динамическое связывание в 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(); 
} 
} 

ответ

2

Наверное, я смутил вас ранее.

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

В вашем примере, мы заинтересованы в появлений здесь

p.show(); 

и здесь

q.show(); 

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

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

Например

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

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

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

0

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

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

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

3

Это здесь

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

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

show in A 
0

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

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

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

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

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

0

- Связывание является акт из method call identifying and calling its method body.

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

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

- Его очень важно знать, что Fields (Переменные экземпляра) являются НЕ полиморфных В ПРИРОДЕ.

В вашем случае динамического связывания здесь:

A q = new B(); 
q.show(); 
Смежные вопросы