


版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、你真的了解 Java 中的數(shù)組嗎?數(shù)組是基本上所有語(yǔ)言都會(huì)有的一種數(shù)據(jù)類型,它表示一組相同類型的數(shù)據(jù)的集合,具有固定的長(zhǎng)度,并且在內(nèi)存中占據(jù)連續(xù)的空間。在 C,C+等語(yǔ)言中,數(shù)組的定義簡(jiǎn)潔清晰,而在 Java 中確有一些會(huì)讓人迷惑的特性,往往讓初學(xué)者發(fā)蒙。本文就嘗試分析這些特性。問題一:Java 中的數(shù)組是對(duì)象嗎?要判斷數(shù)組是不是對(duì)象,那么首先明確對(duì)象?在較高的層面上,對(duì)象是根據(jù)某個(gè)類創(chuàng)建出來(lái)的一個(gè)實(shí)例,表示某類事物中一個(gè)具體的。對(duì)象具有各種屬性,并且具有一些特定的行為。而在較低的層面上,站在計(jì)算機(jī)的角度,對(duì)象就是堆內(nèi)存中的一個(gè)區(qū)域,在這個(gè)內(nèi)存塊中封裝了一些數(shù)據(jù)(即類中定義的各個(gè)屬性值),所以
2、,對(duì)象是用來(lái)封裝數(shù)據(jù)的。以下為一個(gè)Teacher 對(duì)象在內(nèi)存中的表示:Teacher tea = new Teacher(“”,34);注意:1)矩形表示一個(gè)(地址)或一個(gè)基本類型的數(shù)據(jù),橢圓表示一個(gè)對(duì)象,多個(gè)矩形組合在一塊,可組成一個(gè)對(duì)象。2)name 在對(duì)象中只表示一個(gè), 也就是一個(gè)地址值,它指向一個(gè)真實(shí)存在的字符串對(duì)象。在這里嚴(yán)格區(qū)分了和對(duì)象。那么在 Java 中,數(shù)組滿足以上的條件嗎?在較高的層面上,數(shù)組不是某類事物中的一個(gè)具體的,而是多個(gè)的集合。那么它應(yīng)該不是對(duì)象。而在計(jì)算機(jī)的角度,數(shù)組也是一個(gè)內(nèi)存塊,也封裝了一些數(shù)據(jù),這樣的話也可以稱之為對(duì)象。以下是一個(gè)數(shù)組在內(nèi)存中的表示: arr
3、 = 1,2,3,4,5;這樣的話, 數(shù)組既可以是對(duì)象, 也可以不是對(duì)象。至于到底是不是把數(shù)組當(dāng)做對(duì)象,全憑Java 的設(shè)計(jì)者決定。在數(shù)組 arr 上, 可以它的屬性,也可以調(diào)用一些方法。這基本上可以認(rèn)定,java 中的數(shù)組也是對(duì)象,它具有 java 中其他對(duì)象的一些基本特點(diǎn):封裝了一些數(shù)據(jù),可以也可以調(diào)用方法。所以,在 Java 中數(shù)組是對(duì)象。屬性,而在 C+中,數(shù)組雖然封裝了數(shù)據(jù),但數(shù)組名只是一個(gè)指針,指向數(shù)組中的首個(gè)元素,既沒有屬性,也沒有方法可以調(diào)用。如下代碼所示:所以 C+中的數(shù)組不是對(duì)象,只是一個(gè)數(shù)據(jù)的集合,而不能當(dāng)做對(duì)象來(lái)使用。問題二:Java 中數(shù)組的類型Java 是一種強(qiáng)類型
4、的語(yǔ)言。既然是對(duì)象, 那么就必須屬于一個(gè)類型,比如根據(jù)類創(chuàng)建一個(gè)對(duì)象,這個(gè)對(duì)象的類型就是 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;/無(wú)法屬性,也不能調(diào)用方法。return 0; ar
5、r = 1,2,3,4,5;len = arr.length;/數(shù)組中保存一個(gè)字段, 表示數(shù)組的長(zhǎng)度/以下方法說(shuō)明數(shù)組可以調(diào)用方法,java 中的數(shù)組是對(duì)象./這些方法是 Object 中的方法,所以可以肯定,數(shù)組的最頂層父類也是 Object String str = arr.toString(); clone = arr.clone();所以,數(shù)組也是有類型的。只是這個(gè)類型顯得比較奇怪。而且也沒有在 Java 的標(biāo)準(zhǔn)庫(kù)中找到這個(gè)類。沒有自己創(chuàng)建這個(gè)類,這只能有一個(gè)解釋,那就是虛擬機(jī)自動(dòng)創(chuàng)建了數(shù)組類型,可以把數(shù)組類型和 8 種基本數(shù)據(jù)類型一樣, 當(dāng)做java 的內(nèi)建類型。這種類型名規(guī)則是這樣
6、的:每一維度用一個(gè)表示;開頭兩個(gè),就代表是二維數(shù)組。后面是數(shù)組中元素的類型(包括基本數(shù)據(jù)類型和數(shù)據(jù)類型)在 java 語(yǔ)言層面上,s 是數(shù)組,也是一個(gè)對(duì)象,那么他的類型應(yīng)該是 String,這樣說(shuō)是合理的。但是在 JVM 中,他的類型為java.lang.String。順便說(shuō)一句普通的類在 JVM 里的類型為“包名.類名”,也就是全限定名。同一個(gè)類型在 java 語(yǔ)言中和在虛擬機(jī)中的表示可能是不一樣的。問題三:Java 中數(shù)組的繼承關(guān)系上面已經(jīng)驗(yàn)證了,數(shù)組是對(duì)象,也就是說(shuō)可以以操作對(duì)象的方式來(lái)操作數(shù)組。并且數(shù)組在虛擬機(jī)中有它特別的類型。既然是對(duì)象,遵循 Java 語(yǔ)言中的規(guī)則:Object 是
7、上帝, 也就是說(shuō)所有類的頂層父類都是 Object。數(shù)組的頂層父類也必須是 Object,這就說(shuō)明數(shù)組對(duì)象可以向上直接到 Object,也可以向下強(qiáng)制類型轉(zhuǎn)換,也可以使用 instanceof 關(guān)鍵字做類型判定。 這一切都和普通對(duì)象一樣。如下代碼所示:/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ù)組類的名字為L(zhǎng)java.lang.String;問題四:Java 中數(shù)組的另一種“繼承”關(guān)系如下代碼是正確的,卻很容易讓疑惑:Object類型的可以指向 String類型的數(shù)組對(duì)象?難道說(shuō) String繼承自 Object,而 Object又繼承自 Object? 讓通過(guò)反射的方式來(lái)驗(yàn)證這個(gè)問題:打印結(jié)果為java.lang.Object,說(shuō)明 String 的直接父類是 Object 而不是 Object。由代碼可知,String的直接父類就是 Object 而不是 Object。String類型的對(duì)象。那么他們的繼承關(guān)系有點(diǎn)像這樣:Object
9、的明明可以指向這樣的話就違背了 Java 單繼承的原則。String不可能即繼承 Object,又繼承 Object。上面的類圖肯定是錯(cuò)誤的。那么只能這樣解釋:數(shù)組類直接繼承了 Object,關(guān)于 Object類型的能夠指向 String類型的對(duì)象,這種情況只能是 Java 語(yǔ)法之中的一個(gè)特例,并不是嚴(yán)格意義上的繼承。也就是說(shuō),String不繼承自 Object,但是我可以允許你向上到Object,這種特性是賦予你的一項(xiàng)。其實(shí)這種關(guān)系可以這樣表述:如果有兩個(gè)類 A 和B,如果 B 繼承(extends)了 A,那么A類型的就可以指向B類型的對(duì)象public sic class Father S
10、tring s = new String5;System.out.prln(s.getClass().getSuperclass().getName();String s = new String5;Object os = s;/成立,說(shuō)明可以用 Object的來(lái)接收 String的對(duì)象 String other = (String) os;/也可以向下if(obj instanceof)System.out.prln(obj 的真實(shí)類型是);上面的結(jié)論可以擴(kuò)展到二維數(shù)組和數(shù)組:上面的代碼可以這樣理解:將 Father數(shù)組看成是一維數(shù)組, 這是個(gè)數(shù)組中的元素為Father,將數(shù)組看成是一維數(shù)組
11、, 這是個(gè)數(shù)組中的元素為,因?yàn)?Father類型的可以指向類型的對(duì)象。類型的對(duì)象,所以,根據(jù)上面的結(jié)論,F(xiàn)ather的可以指向但是,數(shù)組的這種用法不能作用于基本類型數(shù)據(jù):這是錯(cuò)誤的, 因?yàn)椴皇穷愋?,Object 不是的父類Java 為什么會(huì)為數(shù)組提供這樣一種語(yǔ)法特性呢?也就是說(shuō)這種語(yǔ)法作用?編寫過(guò) Android 中數(shù)據(jù)庫(kù)操作程序的同學(xué)可能發(fā)現(xiàn)過(guò)這種現(xiàn)象,用一個(gè) Object接收所有的數(shù)組對(duì)象,在編譯 SQL 語(yǔ)句時(shí),為 SQL 語(yǔ)句中的占位符提供對(duì)應(yīng)的值。所以這種特性主要是用于方法中參數(shù)的傳遞。如果不傳遞數(shù)組,而是依次傳遞各個(gè)值,會(huì)使方法參數(shù)列表變得冗長(zhǎng)。如果使用具體的數(shù)組類型,如 Stri
12、ng,那么就限定了類型,失去了靈活性。所以傳遞數(shù)組類型是一種比較好的方式。但是如果沒有上面的數(shù)組特性(即db.execSQL(INSERTOVALUES (NULL, ?, ?), new O,.age); arr = 1,2,3,4,5;Object objaa = arr;/錯(cuò)誤的,不能通過(guò)編譯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,說(shuō)明的直接父類是 Object如果有兩個(gè)類 A 和 B,如果 B 繼承(extends)了 A,那么 A類型的就可以指向 B類型的對(duì)象),那么數(shù)組類型就只能通過(guò) Object 類型接收,這樣就無(wú)法在方法組中的各個(gè)元素。如下代碼:或遍歷數(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ù)組,因?yàn)檫@樣無(wú)法對(duì)數(shù)組的元素進(jìn)行/ obj1/錯(cuò)誤/如果在方法對(duì) obj到數(shù)組,存在類型轉(zhuǎn)換異常的風(fēng)險(xiǎn)/ O
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理物資管理2025年度工作方案范文
- 2024-2025學(xué)年高一語(yǔ)文名師輔導(dǎo)計(jì)劃
- 房地產(chǎn)業(yè)農(nóng)民工工資保障措施
- 施工電梯回頂技術(shù)規(guī)范措施
- 土建施工員安全檢查職責(zé)他
- 統(tǒng)編版高中語(yǔ)文教材教學(xué)反思心得體會(huì)
- 實(shí)驗(yàn)室設(shè)備噪音控制措施
- 部編版小學(xué)五年級(jí)語(yǔ)文上冊(cè)第一單元難忘的一天作文范文
- 疾控中心新冠核酸檢測(cè)判讀及數(shù)據(jù)上報(bào)流程
- 小學(xué)語(yǔ)文教研活動(dòng)組織計(jì)劃
- 中國(guó)各省區(qū)地圖、基本資料
- 2025年廣州市荔灣區(qū)招考社區(qū)居委會(huì)專職工作人員招考高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年全國(guó)普通話水平測(cè)試題標(biāo)準(zhǔn)試卷(共三十五套)
- 2025年全國(guó)保密知識(shí)競(jìng)賽經(jīng)典試題庫(kù)及答案(共270題)
- 2024年工廠車間主管年終總結(jié)
- 2025年中醫(yī)治未病服務(wù)工作計(jì)劃及措施
- 資金入股公司合同范例
- 出國(guó)境保密培訓(xùn)
- 使用錯(cuò)誤評(píng)估報(bào)告(可用性工程)模版
- 2023年貴州公務(wù)員考試申論試題(B卷)
- 高中生物必修知識(shí)點(diǎn)總結(jié)(人教版復(fù)習(xí)提綱)高考基礎(chǔ)
評(píng)論
0/150
提交評(píng)論