簡體   English   中英

有關類的語法(Java)

[英]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派生的類型(例如AB ),則可以將其聲明為A[]並存儲從A繼承的任何類型(例如AB )。

在原始代碼中,語法((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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM