• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            Java語言深入:關于java數組的深度思考

            剛剛開始接觸java數組的人都會聽到一句類似的話:java是純面向對象的語言,他的數組也是一個對象。

              于是乎,我就按照一個對象的方式來使用數組,心安理得。直到我接觸到C的數組后,才發現將數組作為一個類來使用在實現上是多么的不自然

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

              MyClass[] arr = new MyClass[9]

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

              MyClass obj = new MyClass();

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

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

              可以通過以下方法得到MyClass[]Class實例:

              arr.getClass()或MyClass[].class.這樣,我就可以向數組類里面窺探了。

              Class clazz = MyClass[].class;

              System.out.printlnclazz.getConstructors()。length);

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

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

              java.lang.InstantiationException [Larraytest.MyClass;

              證明數組類不能夠通過普通的反射方式來創建一個實例。

              再看看數組類的廬山真面目

              System.out.printlnclazz);

              輸出是:

              [Larraytest.MyClass

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

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

              分析到這里,我基本上可以肯定:java對數組對象化的操作的支持是指令級的,也就是說java虛擬機有專門針對數組的指令。數組的Class類實例是java虛擬機動態創建動態加載的,其結構與普通java類的Class實例有一些不同。

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

              下面這句話用來創建一個一維的、長度為10的、類型為arraytest.MyClass的數組:

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

              下面這句話用來創建一個二維的、35的、類型為arraytest.MyClass的數組:

              int[] arrModel = new int[]{3,5}

              Object arrObj = Array.newInstanceSub.class, arrModel);

              當然你可以用一個數組的引用指向上面的二維數組,這里我們用一個Object的引用指向他。

              使用的時候,我們也是可以利用Array類提供的方法來實現:

              System.out.printlnArray.getLengtharrObj);//第一維長度為3

              System.out.printlnArray.getLengthArray.getarrObj 2)));//第二維長度為5,這里如果寫3,就會得到你意想之中的

              java.lang.ArrayIndexOutOfBoundsException

              打印結果是如我所想的:

              3

              5

              對于數組的Class類實例,還有一些奇怪的現象:在運行代碼java.lang.reflect.Field fieldarr = clazz.getField"length");的時候,會拋出異常:java.lang.NoSuchFieldException length,這似乎在說數組類沒有length這個域,而這個域其實是我們用的最多的一個(也就是說這個域是肯定存在的)。我想關于數組的Class類實例、數組的實現等,還有很多貓膩在里面。

              順便說一句,java數組最多只能是255維的。這個讓人看到了C的影子,嘿嘿。

              “Java把數組當作一個java類來處理說起來容易,用起來自然,但是細細想來,還是有很多不簡單的地方呀。

            posted on 2009-08-10 14:38 肥仔 閱讀(229) 評論(1)  編輯 收藏 引用 所屬分類: Web-后臺

            評論

            # re: Java語言深入:關于java數組的深度思考  回復  更多評論   

            顯然是因為java在支持數組的時候還不支持泛型導致的,.net上面沒這個本質上的區別。
            2009-08-10 19:20 | 陳梓瀚(vczh)
            国产毛片久久久久久国产毛片| 中文字幕无码久久人妻| 色欲久久久天天天综合网精品| 久久亚洲精品国产精品婷婷 | 久久精品国产亚洲AV香蕉| 国产成人精品三上悠亚久久| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 日韩乱码人妻无码中文字幕久久| 久久精品国产亚洲av高清漫画 | 亚洲美日韩Av中文字幕无码久久久妻妇| 狠狠色丁香久久婷婷综合_中| 久久精品99久久香蕉国产色戒| 精品人妻伦九区久久AAA片69 | 亚洲伊人久久精品影院| 麻豆精品久久精品色综合| 久久综合视频网| 国产精品成人久久久久久久| 亚洲中文久久精品无码ww16 | 人妻无码精品久久亚瑟影视| 久久AV高清无码| 精品国产乱码久久久久久呢| 久久久久久久国产免费看| 久久精品国产久精国产思思| 久久久久久久久波多野高潮| 精品亚洲综合久久中文字幕| 久久亚洲精品中文字幕| 久久国产欧美日韩精品免费| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产亚洲精品久久久久秋霞| 久久久久国产精品麻豆AR影院| 久久精品国产69国产精品亚洲| 99久久99久久精品国产片果冻 | 中文成人无码精品久久久不卡| 99久久精品无码一区二区毛片| 精品久久久久久国产潘金莲| 久久综合九色综合网站| 99久久夜色精品国产网站 | 久久无码国产| 一本久久a久久精品综合香蕉| 久久久精品国产亚洲成人满18免费网站 | 麻豆AV一区二区三区久久|