關于java數組的深度思考

字號:

剛剛開始接觸java數組的人都會聽到一句類似的話:java是純面向對象的語言,他的數組也是一個對象。于是乎,筆者就按照一個對象的方式來使用數組,心安理得。直到我接觸到C的數組后,才發(fā)現將數組作為一個類來使用在實現上是多么的“不自然”。
    首先我們看一下表面現象,數組創(chuàng)建的時候采用的是如下語句:
    MyClass[] arr = new MyClass[9];
    而普通類采用的是如下語句:
    MyClass obj = new MyClass();
    就是說,創(chuàng)建數組的時候不使用小括號傳參。使得數組和普通類看起來就有很多不同,因為小括號里的參數是傳遞給構造方法的,進而讓人感覺數組類是沒有構造方法的。
    再往深了想,還有很多讓人感覺不自然的東西??梢钥隙ǖ氖?,java確實將數組作為了一個類來處理。還是用上面的例子說明:
    可以通過以下方法得到MyClass[]的Class實例:arr.getClass()或MyClass[].class。這樣,我就可以向數組類里面“窺探”了。
    Class clazz = MyClass[].class;
    System.out.println(clazz.getConstructors().length);
    打印出來的結果是0;證明數組類確實沒有構造方法。
    如果強行執(zhí)行clazz.newInstance();就會得到下面的錯誤。
    java.lang.InstantiationException: [Larraytest.MyClass;
    證明數組類不能夠通過普通的反射方式來創(chuàng)建一個實例。
    再看看數組類的“廬山真面目”:
    System.out.println(clazz);
    輸出是:
    [Larraytest.MyClass
    對Java Class文件結構稍有了結就知道,這個字符串的意思就是一個元素類型為arraytest.MyClass的一維數組。也就是說,數組類型不是和普通類一樣,以一個全限定路徑名+類名來作為自己的標示的,而是以[+一個或者多個L+數組元素類全限定路徑+類來最為標示的。這個()也是數組和普通類的區(qū)別。而這個區(qū)別似乎在某種程度上說明數組和普通java類在實現上有很大區(qū)別。因為java虛擬機(java指令集)在處理數組類和普通類的時候,肯定會做出區(qū)分。筆者猜想,可能會有專門的java虛擬機指令來處理數組。