2013-11-24 80 views
0

我有一個主類,A類和B類(B類繼承自A)。關於類的語法(Java)

從我的主要我創建一個數組並具有A和B的內部。

Object[] tab = new Object[7]; 
tab[0] = new B(-10); 
tab[1] = new A(); 

我然後調用從類

((A) tab[2]).analyser(tab[1]); 
((B) tab[5]).analyser(tab[1]); 

我得到了這部分關於(A)&(B)困惑的方法。 (這兩個類都有一個稱爲分析器的方法)。我不明白它的意義(爲什麼有一個(A)和(B)之前的標籤,目的是什麼),我的猜測是,我們調用的數組,但類A - >( A)和(B)分別...但它不能說服我。

它是一個更大的編碼的一部分,但我希望這將足以得到我的答案。

+0

你在使用? – drf

+0

Java語言(不是Java腳本) – NaC114

+0

它是一個完整的例子嗎?因爲顯然'tab [2]'是未初始化的。無論如何,事情是'Object'沒有方法'analyse',所以你把對象轉換成類'A'或'B'。 「A」數組將刪除此要求(除非方法被聲明爲「final」)。 – keltar

回答

0

實際上,這個代碼可以等效地這樣表示:

A[] tab = new A[7]; 
tab[0] = new B(-10); // permitted since B derives from A 
tab[1] = new A(); 
// ... 
tab[2].analyser(tab[1]); 
tab[5].analyser(tab[1]); 

一般來說,聲明數組的時候,最好使用可以包含數組有望保持所有對象的最具體類型。如果數組需要包含任何對象(字符串,其他數組,A等),則只能將其聲明爲object[](並存儲從Object繼承的任何類型)。如果僅預期陣列保持來源於A(例如,AB)的類型,則其可以被聲明爲A[]並且存儲從A(例如,AB)繼承的任何類型。

在原始代碼中,語法((A)tab[2])用於將tab[2]轉換爲更多派生類型(在此例中爲A);它本質上告訴編譯器,「將tab[2]視爲它被聲明爲A」。由於tab被定義爲Object的數組,並且Object不包含analyser方法,因此需要將其轉換爲定義要調用的方法的類(此處爲analyser)。

儘管tab[0]被定義爲B的一個實例,但它可以向上投射到派生較少的類型A。在這種情況下,調用(((A)tab[0]).analyzer(tab[1])和(((B)tab[0]).analyser(tab[1]))相同的功能,即使B具有爲analyser自己的定義。(這個概念被稱爲多態性。)