你真的了解java中的數(shù)組嗎_第1頁
你真的了解java中的數(shù)組嗎_第2頁
你真的了解java中的數(shù)組嗎_第3頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、你真的了解 Java 中的數(shù)組嗎?數(shù)組是基本上所有語言都會有的一種數(shù)據(jù)類型,它表示一組相同類型的數(shù)據(jù)的集合,具有固定的長度,并且在內(nèi)存中占據(jù)連續(xù)的空間。在 C,C+等語言中,數(shù)組的定義簡潔清晰,而在 Java 中確有一些會讓人迷惑的特性,往往讓初學者發(fā)蒙。本文就嘗試分析這些特性。問題一:Java 中的數(shù)組是對象嗎?要判斷數(shù)組是不是對象,那么首先明確對象?在較高的層面上,對象是根據(jù)某個類創(chuàng)建出來的一個實例,表示某類事物中一個具體的。對象具有各種屬性,并且具有一些特定的行為。而在較低的層面上,站在計算機的角度,對象就是堆內(nèi)存中的一個區(qū)域,在這個內(nèi)存塊中封裝了一些數(shù)據(jù)(即類中定義的各個屬性值),所以

2、,對象是用來封裝數(shù)據(jù)的。以下為一個Teacher 對象在內(nèi)存中的表示:Teacher tea = new Teacher(“”,34);注意:1)矩形表示一個(地址)或一個基本類型的數(shù)據(jù),橢圓表示一個對象,多個矩形組合在一塊,可組成一個對象。2)name 在對象中只表示一個, 也就是一個地址值,它指向一個真實存在的字符串對象。在這里嚴格區(qū)分了和對象。那么在 Java 中,數(shù)組滿足以上的條件嗎?在較高的層面上,數(shù)組不是某類事物中的一個具體的,而是多個的集合。那么它應(yīng)該不是對象。而在計算機的角度,數(shù)組也是一個內(nèi)存塊,也封裝了一些數(shù)據(jù),這樣的話也可以稱之為對象。以下是一個數(shù)組在內(nèi)存中的表示: arr

3、 = 1,2,3,4,5;這樣的話, 數(shù)組既可以是對象, 也可以不是對象。至于到底是不是把數(shù)組當做對象,全憑Java 的設(shè)計者決定。在數(shù)組 arr 上, 可以它的屬性,也可以調(diào)用一些方法。這基本上可以認定,java 中的數(shù)組也是對象,它具有 java 中其他對象的一些基本特點:封裝了一些數(shù)據(jù),可以也可以調(diào)用方法。所以,在 Java 中數(shù)組是對象。屬性,而在 C+中,數(shù)組雖然封裝了數(shù)據(jù),但數(shù)組名只是一個指針,指向數(shù)組中的首個元素,既沒有屬性,也沒有方法可以調(diào)用。如下代碼所示:所以 C+中的數(shù)組不是對象,只是一個數(shù)據(jù)的集合,而不能當做對象來使用。問題二:Java 中數(shù)組的類型Java 是一種強類型

4、的語言。既然是對象, 那么就必須屬于一個類型,比如根據(jù)類創(chuàng)建一個對象,這個對象的類型就是 Teacher。那么數(shù)組的類型是什么呢?看下面的代碼: arr = 1, 2, 3, 4, 5;System.out.prln(arr.getClass().getName();/打印出的數(shù)組類的名字為IString s = new String2;System.out.prln(s.getClass().getName();/打印出的數(shù)組類的名字為 Ljava.lang.String;main()arr = 1, 2, 3, 4;* pa = arr;/無法屬性,也不能調(diào)用方法。return 0; ar

5、r = 1,2,3,4,5;len = arr.length;/數(shù)組中保存一個字段, 表示數(shù)組的長度/以下方法說明數(shù)組可以調(diào)用方法,java 中的數(shù)組是對象./這些方法是 Object 中的方法,所以可以肯定,數(shù)組的最頂層父類也是 Object String str = arr.toString(); clone = arr.clone();所以,數(shù)組也是有類型的。只是這個類型顯得比較奇怪。而且也沒有在 Java 的標準庫中找到這個類。沒有自己創(chuàng)建這個類,這只能有一個解釋,那就是虛擬機自動創(chuàng)建了數(shù)組類型,可以把數(shù)組類型和 8 種基本數(shù)據(jù)類型一樣, 當做java 的內(nèi)建類型。這種類型名規(guī)則是這樣

6、的:每一維度用一個表示;開頭兩個,就代表是二維數(shù)組。后面是數(shù)組中元素的類型(包括基本數(shù)據(jù)類型和數(shù)據(jù)類型)在 java 語言層面上,s 是數(shù)組,也是一個對象,那么他的類型應(yīng)該是 String,這樣說是合理的。但是在 JVM 中,他的類型為java.lang.String。順便說一句普通的類在 JVM 里的類型為“包名.類名”,也就是全限定名。同一個類型在 java 語言中和在虛擬機中的表示可能是不一樣的。問題三:Java 中數(shù)組的繼承關(guān)系上面已經(jīng)驗證了,數(shù)組是對象,也就是說可以以操作對象的方式來操作數(shù)組。并且數(shù)組在虛擬機中有它特別的類型。既然是對象,遵循 Java 語言中的規(guī)則:Object 是

7、上帝, 也就是說所有類的頂層父類都是 Object。數(shù)組的頂層父類也必須是 Object,這就說明數(shù)組對象可以向上直接到 Object,也可以向下強制類型轉(zhuǎn)換,也可以使用 instanceof 關(guān)鍵字做類型判定。 這一切都和普通對象一樣。如下代碼所示:/1數(shù)組的頂層父類是 Object, 所以可以向上 a = 1, 2, 3, 4, 5;Object obj = a ;/2那么能向下嗎? 可以 b = ()obj;/3能使用 instanceof 關(guān)鍵字判定嗎? 可以public class / .String ss = new String23;System.out.prln(ss.getC

8、lass().getName();/打印出的數(shù)組類的名字為Ljava.lang.String;問題四:Java 中數(shù)組的另一種“繼承”關(guān)系如下代碼是正確的,卻很容易讓疑惑:Object類型的可以指向 String類型的數(shù)組對象?難道說 String繼承自 Object,而 Object又繼承自 Object? 讓通過反射的方式來驗證這個問題:打印結(jié)果為java.lang.Object,說明 String 的直接父類是 Object 而不是 Object。由代碼可知,String的直接父類就是 Object 而不是 Object。String類型的對象。那么他們的繼承關(guān)系有點像這樣:Object

9、的明明可以指向這樣的話就違背了 Java 單繼承的原則。String不可能即繼承 Object,又繼承 Object。上面的類圖肯定是錯誤的。那么只能這樣解釋:數(shù)組類直接繼承了 Object,關(guān)于 Object類型的能夠指向 String類型的對象,這種情況只能是 Java 語法之中的一個特例,并不是嚴格意義上的繼承。也就是說,String不繼承自 Object,但是我可以允許你向上到Object,這種特性是賦予你的一項。其實這種關(guān)系可以這樣表述:如果有兩個類 A 和B,如果 B 繼承(extends)了 A,那么A類型的就可以指向B類型的對象public sic class Father S

10、tring s = new String5;System.out.prln(s.getClass().getSuperclass().getName();String s = new String5;Object os = s;/成立,說明可以用 Object的來接收 String的對象 String other = (String) os;/也可以向下if(obj instanceof)System.out.prln(obj 的真實類型是);上面的結(jié)論可以擴展到二維數(shù)組和數(shù)組:上面的代碼可以這樣理解:將 Father數(shù)組看成是一維數(shù)組, 這是個數(shù)組中的元素為Father,將數(shù)組看成是一維數(shù)組

11、, 這是個數(shù)組中的元素為,因為 Father類型的可以指向類型的對象。類型的對象,所以,根據(jù)上面的結(jié)論,F(xiàn)ather的可以指向但是,數(shù)組的這種用法不能作用于基本類型數(shù)據(jù):這是錯誤的, 因為不是類型,Object 不是的父類Java 為什么會為數(shù)組提供這樣一種語法特性呢?也就是說這種語法作用?編寫過 Android 中數(shù)據(jù)庫操作程序的同學可能發(fā)現(xiàn)過這種現(xiàn)象,用一個 Object接收所有的數(shù)組對象,在編譯 SQL 語句時,為 SQL 語句中的占位符提供對應(yīng)的值。所以這種特性主要是用于方法中參數(shù)的傳遞。如果不傳遞數(shù)組,而是依次傳遞各個值,會使方法參數(shù)列表變得冗長。如果使用具體的數(shù)組類型,如 Stri

12、ng,那么就限定了類型,失去了靈活性。所以傳遞數(shù)組類型是一種比較好的方式。但是如果沒有上面的數(shù)組特性(即db.execSQL(INSERTOVALUES (NULL, ?, ?), new O,.age); arr = 1,2,3,4,5;Object objaa = arr;/錯誤的,不能通過編譯ss = new24;Father fathers =ss;public sic classextends Father /下面成立嗎?Father 是的直接父類s = new3; Father fa =s;/成立/那么 的直接父類是 Father 還是 Object 或者是 O

13、bject? System.out.prln(s.getClass().getSuperclass().getName();/打印結(jié)果為java.lang.Object,說明的直接父類是 Object如果有兩個類 A 和 B,如果 B 繼承(extends)了 A,那么 A類型的就可以指向 B類型的對象),那么數(shù)組類型就只能通過 Object 類型接收,這樣就無法在方法組中的各個元素。如下代碼:或遍歷數(shù)private sic void test3() String a = new String3; doArray(a);private sic void doArray(Object objs)private sic void doArray1(Object obj)/不能用 Object 接收數(shù)組,因為這樣無法對數(shù)組的元素進行/ obj1/錯誤/如果在方法對 obj到數(shù)組,存在類型轉(zhuǎn)換異常的風險/ O

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論