[英]Syntax regarding classes (Java)
我有一個主類,A類和B類(B類繼承自A類)。
從我的主我創建一個數組,並在內部的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)……但這並不能說服我。
它是更大代碼的一部分,但是我希望這足以得到我的答案。
實際上,此代碼可以等效地表示為:
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
派生的類型(例如A
和B
),則可以將其聲明為A[]
並存儲從A
繼承的任何類型(例如A
和B
)。
在原始代碼中,語法((A)tab[2])
用於將tab[2]
轉換為更派生的類型(在本例中為A
); 它從本質上告訴編譯器“就像將tab[2]
聲明為A
”。 由於tab
被定義為Object
的數組,並且Object
不包含analyser
方法,因此您需要轉換為定義要調用的方法的類(此處為analyser
)。
即使tab[0]
被定義為B
的實例,也可以向上將其轉換為派生較少的類型A
在這種情況下,即使B
調用(( ((A)tab[0]).analyzer(tab[1])
和( ((B)tab[0]).analyser(tab[1])
))在功能上等效為analyser
提供了自己的定義(此概念稱為多態)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.