2011-06-22 82 views
0

狀況:說我有一類A,其延伸的並且延伸B.class A具有的方法招呼(C類B類),其在B類中重寫在多級繼承中調用哪個版本的方法?

EVENT:現在C類調用hello()。

問題:哪個版本將被調用?我想它將是層次結構中上面的類,即B.在任何情況下,如何從C訪問不同版本的hello()?

相關問題:通過使用super,我們可以訪問剛纔在層次結構中的版本,但是如何訪問層次結構中較高版本的版本?例如,如何從C訪問A的hello()?

+2

有沒有簡單的機制讓你好。 –

回答

2

你不能。只有B中的代碼可以使用super來撥打A.hello();如果A,B和C全部實施hello(),C中的任何代碼都不可能訪問A.hello()

通常,任何類中的代碼都可以調用它自己的方法版本,以及它的直接超類的版本,就是這樣。沒有超類的合作,沒有辦法給別人打電話。

+0

那麼如果變量x在A中,它不能被C訪問? – aps

+1

變量與方法完全不同。方法具有多態性,變量不具有多態性。如果A有一個變量'x',那麼如果它是公共的或保護的(或者如果所有類都在同一個包中,則默認是),則可以通過'B'和'C'來訪問。如果該變量是私有的,那麼B和C都不能訪問它。 –

+0

如果方法hello()沒有在中間類B中覆蓋,也沒有在C中,那麼C可以訪問A的hello()? – aps

0

動態方法調度 動態方法調度是在運行時調用重寫方法的機制,而不是編譯時間。動態方法調度很重要,因爲這是Java實現運行時多態性的方式。 超類引用變量可以引用子類對象。 Java使用這個事實來解析對運行時重寫的方法的調用。這是如何。當通過超類引用調用重寫的方法時,Java會根據調用發生時引用的對象的類型來確定要執行的方法的哪個版本。因此,這個決定是在運行時進行的。當引用不同類型的對象時,將調用不同版本的重寫方法。換句話說,它是被引用的對象的類型(不是引用變量的類型),它確定將執行重寫方法的哪個版本。因此,如果超類包含被子類重寫的方法,那麼當通過超類引用變量引用不同類型的對象時,將執行不同版本的方法。

實施例: A類

{

int a; 

void show() 
{ 
    a=10; 
    System.out.println("a of A : "+a); 
} 

}

B類延伸的

{

int a; 
void show() 
{ 
    a=20; 
    System.out.println("a of B : "+a); 
} 

}

C類延伸乙

{

int a; 
void show() 

{ 
    a=30; 
    System.out.println("a of C : "+a); 
} 

}

類歧義

{

public static void main(String args[]) 

{ 
    A oa = new A(); 
    B ob = new B(); 
    C oc = new C(); 
    A r;//r is superclass reference variable 

    r = oa; 
    r.show(); 

    r = ob; 
    r.show(); 

    r = oc; 
    r.show(); 

} 

}