欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
關(guān)于java數組的深度思考
 剛剛開(kāi)始接觸java數組的人都會(huì )聽(tīng)到一句類(lèi)似的話(huà):java是純面向對象的語(yǔ)言,他的數組也是一個(gè)對象。于是乎,筆者就按照一個(gè)對象的方式來(lái)使用數組,心安理得。直到我接觸到C的數組后,才發(fā)現將數組作為一個(gè)類(lèi)來(lái)使用在實(shí)現上是多么的“不自然”。

 

  
  首先我們看一下表面現象,數組創(chuàng )建的時(shí)候采用的是如下語(yǔ)句:

 

  MyClass[] arr = new MyClass[9];

  而普通類(lèi)采用的是如下語(yǔ)句:

  MyClass obj = new MyClass();

  就是說(shuō),創(chuàng )建數組的時(shí)候不使用小括號傳參。使得數組和普通類(lèi)看起來(lái)就有很多不同,因為小括號里的參數是傳遞給構造方法的,進(jìn)而讓人感覺(jué)數組類(lèi)是沒(méi)有構造方法的。

  
再往深了想,還有很多讓人感覺(jué)不自然的東西??梢钥隙ǖ氖?,java確實(shí)將數組作為了一個(gè)類(lèi)來(lái)處理。還是用上面的例子說(shuō)明:

  可以通過(guò)以下方法得到MyClass[]的Class實(shí)例:arr.getClass()或MyClass[].class。這樣,我就可以向數組類(lèi)里面“窺探”了。

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

  
  打印出來(lái)的結果是0;證明數組類(lèi)確實(shí)沒(méi)有構造方法。

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

  java.lang.InstantiationException: [Larraytest.MyClass;

  證明數組類(lèi)不能夠通過(guò)普通的反射方式來(lái)創(chuàng )建一個(gè)實(shí)例。

  
  再看看數組類(lèi)的“廬山真面目”:

  System.out.println(clazz);

  輸出是:

  [Larraytest.MyClass

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

  既然我們可以得到數組的Class類(lèi)實(shí)例,就說(shuō)明肯定需要調用ClassLoader的 defineClass(不一定非要是loadClass方法)方法,來(lái)構造一個(gè)Class實(shí)例。java虛擬機規范規定,任何一個(gè)可以被加載的類(lèi),如果其類(lèi)文件存儲在文件系統上,那么一個(gè)*.class文件只能存儲一個(gè)類(lèi)信息,也就是說(shuō),數組類(lèi)的信息不可能以類(lèi)文件的形式存儲在本地磁盤(pán)上(否則任意一個(gè)類(lèi)都要配有255個(gè)數組類(lèi)了.....),既然這樣,那就說(shuō)明java虛擬機肯定內置了一塊用來(lái)聲明數組類(lèi)的數據(不管是幾級數組)。這是符合java虛擬機規范的,規范規定class類(lèi)數據可以來(lái)自任意介質(zhì),包括本地磁盤(pán)、網(wǎng)絡(luò )、數據庫、內存等等。

  分析到這里,我基本上可以肯定:java對數組對象化的操作的支持是指令級的,也就是說(shuō)java虛擬機有專(zhuān)門(mén)針對數組的指令。數組的Class類(lèi)實(shí)例是java虛擬機動(dòng)態(tài)創(chuàng )建動(dòng)態(tài)加載的,其結構與普通java類(lèi)的Class實(shí)例有一些不同。

  JDK API中有一個(gè)java.lang.reflect.Array類(lèi),這個(gè)類(lèi)提供了很多方法(絕大多數是native方法,這在另一個(gè)方面證明了java對數組的支持是專(zhuān)用指令支持的,否則用本地方法干嘛^_^),用來(lái)彌補我們對數組操作的局限性。

  下面這句話(huà)用來(lái)創(chuàng )建一個(gè)一維的、長(cháng)度為10的、類(lèi)型為arraytest.MyClass的數組:

  arraytest.MyClass[] arr = (arraytest.MyClass[]) Array.newInstance(arraytest.MyClass, 10);

  下面這句話(huà)用來(lái)創(chuàng )建一個(gè)二維的、3乘5的、類(lèi)型為arraytest.MyClass的數組:

  int[] arrModel = new int[]{3,5};
Object arrObj = Array.newInstance(Sub.class, arrModel);

  當然你可以用一個(gè)數組的引用指向上面的二維數組,這里我們用一個(gè)Object的引用指向他。
使用的時(shí)候,我們也是可以利用Array類(lèi)提供的方法來(lái)實(shí)現:

  System.out.println(Array.getLength(arrObj);//第一維長(cháng)度為3
  System.out.println(Array.getLength(Array.get(arrObj, 2)));//第二維長(cháng)度為5,這里如果寫(xiě)3,就會(huì )得到你意想之中的java.lang.ArrayIndexOutOfBoundsException

  打印結果是如我們所想的:

  3
  5

  對于數組的Class類(lèi)實(shí)例,還有一些奇怪的現象:

  在運行代碼 java.lang.reflect.Field fieldarr = clazz.getField("length");的時(shí)候,會(huì )拋出異常:java.lang.NoSuchFieldException: length,這似乎在說(shuō)數組類(lèi)沒(méi)有length這個(gè)域,而這個(gè)域其實(shí)是我們用的最多的一個(gè)(也就是說(shuō)這個(gè)域是肯定存在的)。筆者認為關(guān)于數組的Class類(lèi)實(shí)例、數組的實(shí)現等,還有很多“貓膩”在里面。
 
  順便說(shuō)一句,java數組最多只能是255維的。這個(gè)讓人看到了C的影子,嘿嘿。“Java把數組當作一個(gè)java類(lèi)來(lái)處理”說(shuō)起來(lái)容易,用起來(lái)自然,但是細細想來(lái),還是有很多不簡(jiǎn)單的地方。

 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Java高新技術(shù)-反射
學(xué)習反射
深入理解Java類(lèi)型信息(Class對象)與反射機制
JAVA反射總結
有關(guān)JVM處理Java數組方法的思考
用最直接的大白話(huà)來(lái)聊一聊Java中的反射機制
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久