深入理解java中數組__java

來源:互聯網
上載者:User
 剛剛開始接觸java數組的人都會聽到一句類似的話:java是純物件導向的語言,他的數組也是一個對象。於是乎,筆者就按照一個對象的方式來使用數組,心安理得。直到我接觸到C的數組後,才發現將數組作為一個類來使用在實現上是多麼的“不自然”。

  
  首先我們看一下表面現象,數組建立的時候採用的是如下語句:

  MyClass[] arr = new MyClass.;

  而普通類採用的是如下語句:

  MyClass obj = new MyClass();

  就是說,建立數組的時候不使用小括弧傳參。使得數組和普通類看起來就有很多不同,因為小括弧裡的參數是傳遞給構造方法的,進而讓人感覺數組類是沒有構造方法的。

  
再往深了想,還有很多讓人感覺不自然的東西。可以肯定的是,java確實將數組作為了一個類來處理。還是用上面的例子說明:

  可以通過以下方法得到MyClass[]的Class執行個體:arr.getClass()或MyClass[].class。這樣,我就可以向數組類裡面“窺探”了。

  
  Class clazz = MyClass[].class;
  System.out.println(clazz.getConstructors().length);

  
  列印出來的結果是0;證明數組類確實沒有構造方法。

  
  如果強行執行clazz.newInstance();就會得到下面的錯誤。

  java.lang.InstantiationException: [Larraytest.MyClass;

  證明數組類不能夠通過普通的反射方式來建立一個執行個體。

  
  再看看數組類的“廬山真面目”:

  System.out.println(clazz);

  輸出是:

  [Larraytest.MyClass

  對Java Class檔案結構稍有了結就知道,這個字串的意思就是一個元素類型為arraytest.MyClass的一維數組。也就是說,數群組類型不是和普通類一樣,以一個全限定路徑名+類名來作為自己的唯一標示的,而是以[+一個或者多個L+數組元素類全限定路徑+類來最為唯一標示的。這個()也是數組和普通類的區別。而這個區別似乎在某種程度上說明數組和普通java類在實現上有很大區別。因為java虛擬機器(java指令集)在處理數組類和普通類的時候,肯定會做出區分。筆者猜想,可能會有專門的java虛擬機器指令來處理數組。

  既然我們可以得到數組的Class類執行個體,就說明肯定需要調用ClassLoader的 defineClass(不一定非要是loadClass方法)方法,來構造一個Class執行個體。java虛擬機器規範規定,任何一個可以被載入的類,如果其類檔案儲存體在檔案系統上,那麼一個*.class檔案只能儲存一個類資訊,也就是說,數組類的資訊不可能以類檔案的形式儲存在本地磁碟上(否則任意一個類都要配有255個數組類了.....),既然這樣,那就說明java虛擬機器肯定內建了一塊用來聲明數組類的資料(不管是幾級數組)。這是符合java虛擬機器規範

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.