看了一篇討論數組的文章:<關於java數組的深度思考>.以下是我自己的一點看法。
首先,要區分類型和類。我們可以很肯定的說數組是一種類型,但是它絕不是類。類型是編譯器相關的概念,其抽象性跟物件導向無關。類是物件導向中的一個概念。他們不再同一個層級。int,byte都是類型,都對應相對的Class,系統也提供了對應的裝箱類。但是要注意的是,對於他們的底層實現和操作都是native的,跟物件導向無關,我們可以認為是“內建對象”,他們是用c來實現的,反射和Proxy也是這樣的。所以可以取到Class的是任何類型,而不是類,這個Class類的本身的操作也都是native的,從這個意義上Object類本身也不是一個純物件導向意義的類。在這個方面,我們可以說:看起來數組不是一個類。
從另一個角度來說,即使在內建的功能上,jdk也沒有準備讓數組成為一個類,通常意義上類(非內部或final)是物件導向的實體,有封裝,繼承,多態的特性。數組不同於集合類,無法繼承,這個是對他的類的身份懷疑的一個證據。(.net似乎想折中,提供了一個Array類作為所有數組的父類。但是還是有些彆扭)。但是A是B的父類,但是A[]和B[]卻不能正確的CastClass。所以,我們也覺得數組不是一個類。
但是更深入一層來說,在虛擬機器中,數組和類的引用同樣是一塊記憶體堆的指標。處理方式和表現方式很像。
總結,在文法和實現方式上,數組不像一個類。在虛擬機器規範和底層實現,數組是一個像類的對象。
-----------------------------------------------------------------------------------------
PS:參考了“Java虛擬機器(Chapter Five: The Java Virtual Machine) (網上看的,不知道什麼書裡的)
3、數組的儲存(Array Representation)
在Java 中,數組是一種完全意義上的對象,他和對象一樣儲存在堆中、有一個指向Class類執行個體的引用。所有同一維度和類型的數組擁有同樣的Class,數組的長 度不做考慮。對應Class的名字表示為維度和類型。比如一個整型資料的Class為“[I”,位元組型三維數組Class名為“[[[B”,兩維對象資料 Class名為“[[Ljava.lang.Object”。
多維陣列被表示為數組的數組,如:
數組必須在堆中儲存數組的長度,數組的資料和一些對象數群組類型資料的引用。通過一個數組引用的,虛擬機器應該能夠取得一個數組的長度,通過索引能夠訪問特定 的資料,能夠調用Object定義的方法。Object是所有資料類的直接父類。更多資訊參見第六章“類檔案”。