2012-12-12 59 views
0

我在java中多態混淆。在動態方法綁定中,jvm在運行時決定哪個類方法必須調用。假設我有三個類A,B和C.Java多態中的混淆

class A{ 
    int get(){ 
     return 10; 
    } 

    int getParent(){ 
     return 10; 
    } 
} 

class B extends A 
{ 
    int get(){ 
     return 20; 
    } 
} 

public class C 
{ 
    public static void main(String args[]) 
    { 
     A a = new A(); 
     A a1 = new B(); 
     System.out.println(a.get());/////////////////////////LINE1  
     System.out.println(a1.get ());////////////////////////LINE2  
     System.out.println(a.getParent());////////////////////////LINE3 
    } 
} 

我在編譯時和運行時綁定時遇到了第1行和第3行的混淆。 在第3行中,a.getParent()和此方法僅在父類中,因此它必須在運行時決定。

在第1行中,引用和對象都來自同一類,所以它必須再次決定。

請給我任何良好的鏈接運行時和編譯時綁定如何工作。

回答

0

B類覆蓋的get()方法。因此,無論何時調用類型爲B的對象的get(),它都將使用重寫的方法。

因爲乙犯規倍率的getParent(),則父的getParent()將在調用它的B類

0

A類上調用提供該對象實例a與虛擬方法表,含有A.get和A.getParent。

B類爲對象實例a1提供了一個虛擬方法表,首先從類A中取出並展開(這裏沒有任何要展開的內容)。使用B.get覆蓋get方法。

a1.get,即使是A,也會調用B.get。

3
class A 
    { 
     public doIt() 
     { 
     //this does something 
     } 
    } 

    class B extends A 
    { 
     public doIt() 
     { 
     //this does something 
     } 
    } 

    class C extends B 
    { 
     public doIt() 
     { 
     //this does something 
     } 

    }   

    public static void main(String[] args) { 
      A x = new B(); 

      x.doIt(); 

    } 

導致大量混淆的語句是「A x = new B();」語句。雖然變量x是類型A的對象,但由於「= new B();」語句的一部分,所以它被實例化爲類B的對象。 Java運行時基本上會看到這個語句並且說「儘管x明確地聲明爲A類,但它被實例化爲類B的對象,所以我將運行在B類中定義的doIt()方法的版本。「

由對象x執行的doIt()方法的版本是類B中的版本,因爲在Java中被稱爲動態綁定 - 上面的代碼可以被認爲是動態綁定。動態綁定基本上意味着實際調用的方法實現是在運行時確定的,而不是在編譯時確定的。這就是爲什麼它被稱爲動態綁定 - 因爲將在運行時選擇將運行的方法。動態綁定也稱爲後期綁定。

早期綁定數據和方法是在complie時間結合,其中如在 後期綁定數據和方法將在運行時綁定。

0

此處的多態性僅適用於line2的情況。沒有應用於line1和line3的多態性概念。