2014-01-06 71 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(); 

在運行時,qB類型和B覆蓋show()所以B#show()被調用的。


在你的回答中,我已經評論過,重寫方法沒有起作用。這更多的是構造函數執行順序的問題。

0

在下面線

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

展示方法的目標對象在運行時確定調用的方法show()

3

它在這裏

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

編譯器使用虛擬呼叫指令(invokeVirtualinvokeInterface),用於可重寫的方法(它們不能是靜態的或私有的)。在此代碼中,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

強大的多態性,在java中使用reflect會放縱你!玩的開心!

0

- 結合行爲method call identifying and calling its method body

- Java只支持動態綁定,,幾個例外情況除外

-編譯器不能瞭解哪些method call到與method body相關...所以它的責任的方法調用來贊同其適當的方法體。

-它非常重要的是知道Fields(實例變量)是自然界中不POLYMORPHIC。

在你的情況下,動態綁定是在這裏:

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