今天繼續(xù)學(xué)習(xí)Java,這次的重點(diǎn)有兩部分。
第一部分我想說一下面向?qū)ο缶幊蹋∣OP)的三種設(shè)計(jì)思路,這也是前人總結(jié)出來的,分別是is-a, has-a以及l(fā)ike-a.
第二部分我想說一下List類的四種中的兩種,ArrayList和LinkedList.
1.面向?qū)ο蟮娜N設(shè)計(jì)思路
1.is-a,A is a B帆阳,說明B是父類,而A是子類资锰,A繼承B的關(guān)系。Inheritance筝野,對應(yīng)的Java關(guān)鍵字為Extends焕议。
2.has-a, A has a B, 說明A包含B, B是A的組成部分,是從屬關(guān)系籽慢,即類與類的對象的關(guān)系猫胁,明教與明教教徒的關(guān)系。
3.like-a, A like a B, A與B是和而不同的關(guān)系届惋,兩者是組合關(guān)系,Composition.
對于第一種關(guān)系拍埠,在昨天的學(xué)習(xí)筆記中我已經(jīng)提到械拍。而第二種關(guān)系迄损,則是掌握了Class并能新建對象氏捞,就基本能搞清楚了谒养。第三種組合關(guān)系苛败,我想舉栗(例)說明一下满葛。
先說為什么Java的設(shè)計(jì)者要搞一個這種關(guān)系径簿,因?yàn)槲覀冊谠O(shè)計(jì)程序時,經(jīng)常需要建立許多類嘀韧,然后再針對這些類設(shè)計(jì)它們的屬性以及方法篇亭。但萬物皆有聯(lián)系,難免會存在有一些屬性或是方法是某幾個類都需要用的情況锄贷,我就不高興再重新把這些屬性和方法重新敲一遍了译蒂,自己手累,IDE的編譯器也很累谊却,為了提高”程序復(fù)用“的效率柔昼,節(jié)約時間,我們通過使用組合的方式炎辨,換言之捕透,結(jié)盟的方式,我們就可以調(diào)用其他對象了碴萧。
就好像在三國赤壁之戰(zhàn)的時候乙嘀,蜀吳聯(lián)盟,諸葛亮就可以調(diào)用東吳水軍破喻。課程中給出的是電腦與電腦組件的調(diào)用關(guān)系虎谢,機(jī)箱,顯示器和主板均是單獨(dú)的類曹质,而電腦是組合后的類嘉冒,有時候需要調(diào)用顯示器來顯示某個字符,就需要調(diào)用顯示器的顯示方法(或是顯示函數(shù))咆繁。
我自己是改寫成了另一個例子讳推,House和Wall這兩類,House包含Wall玩般,然后調(diào)用Wall的設(shè)置壁紙顏色的方法银觅。截圖如下:
可以看出,通過組合坏为,可以減少一些重復(fù)工作究驴,類似于Proficient中數(shù)據(jù)錄入方式為Database history,也是一種調(diào)用匀伏。
2.ArrayList和LinkedList
ArrayList是數(shù)組隊(duì)列洒忧,這個數(shù)組是一個動態(tài)數(shù)組,大小够颠,內(nèi)容都可以改變熙侍,它比較適合于需要在數(shù)據(jù)尾部增加/刪除元素的情況。
LinkedList是一個雙向鏈表,因?yàn)樗氖孜苍鼐怯赏粋€Header指向蛉抓,同時庆尘,每個元素還存儲了它前后2個元素的引用,即Previous和Next,但當(dāng)我們需要鏈表中增加/刪除元素時巷送,它需要從首/尾遍歷整個鏈表來找到相應(yīng)的位置驶忌。
因此,ArrayList適用于大量隨機(jī)訪問的情況笑跛,而LinkedList只適用于針對首尾位置的元素進(jìn)行訪問的情況付魔。
舉例來說,我需要根據(jù)路人甲的銀行卡號識別它是哪一個銀行的什么卡飞蹂,一般是卡號的前幾號几苍,這時需要使用ArrayList,一個ArrayList存放卡的前幾位晤柄,一個ArrayList存放相應(yīng)的銀行卡類型和名稱擦剑。這就相當(dāng)于一個對照表,當(dāng)需要增加時芥颈,我們在表格的最后增加即可惠勒。根據(jù)某一張卡進(jìn)行查詢時,因?yàn)椴樵兊慕Y(jié)果作在的位置是隨機(jī)的爬坑,所以用ArrayList纠屋。
而當(dāng)我需要維護(hù)一張實(shí)驗(yàn)單清單時,我覺得可以使用LinkedList盾计,因?yàn)樾伦缘膶?shí)驗(yàn)單只會出現(xiàn)在最后售担。
針對這兩種List舉例寫代碼,截圖如下:
明天請大家繼續(xù)關(guān)注署辉。