《HEAD FIRST JAVA》第一次回顧和整理
第一章 進(jìn)入Java的世界(基本概念)
主要介紹了Java的工作原理,發(fā)展簡(jiǎn)史,程序結(jié)構(gòu)和一些簡(jiǎn)單的語(yǔ)法。學(xué)過(guò)其他語(yǔ)言的人表示這章完全沒(méi)有壓力。
1, 程序的層次:源文件(source file)->類(class)->方法(methods)。
2, Java里面integer和boolean不相容。
3, 語(yǔ)法與C差不多,不過(guò)作者好像一直很反感拿C與Java作比較。
第二章 拜訪對(duì)象村(類與對(duì)象)
一開(kāi)始用了一個(gè)巨冷的故事來(lái)闡述面向過(guò)程編程與面向?qū)ο缶幊痰牟顒e(結(jié)果當(dāng)然是面向?qū)ο髢?yōu)勝= =先保留意見(jiàn)吧)。
1, 繼承機(jī)制使子類可以通過(guò)繼承父類代碼來(lái)減少重復(fù)代碼,覆蓋機(jī)制使子類在不必改動(dòng)父類的同時(shí)可以選擇實(shí)現(xiàn)自己的方法。(這個(gè)機(jī)制太強(qiáng)大了!)
2, 類是繪制對(duì)象的藍(lán)圖,而對(duì)象是已知的事物加上執(zhí)行的動(dòng)作。對(duì)應(yīng)著,類包括實(shí)例變量(instance variable)和方法(methods)。
3, Java程序執(zhí)行期間是一組可以相互調(diào)用或交流信息的對(duì)象,對(duì)象之間有著獨(dú)立性(對(duì)象自治)。
4, main()在java里面的作用:測(cè)試真正的類和啟動(dòng)Java應(yīng)用程序。Java是面向?qū)ο蟮木幊蹋詍ain()里面基本是不帶任何方法的,僅作為測(cè)試用和啟動(dòng)用。
第三章 認(rèn)識(shí)變量(primitive主數(shù)據(jù)類型和引用)
介紹了primitive類型變量和引用變量,并闡述了之前的差別。
1, 變量必須有變量類型,兩性類型與類之間有時(shí)是共通的,所以一般有著相同的命名規(guī)則(如果可能的話,每個(gè)單詞的首字母都要大些,區(qū)分于變量名稱的命名:除了第一個(gè)單詞首字母要小寫(xiě)外,之后的單詞的首字母都要大寫(xiě))。
2, 變量名稱必須以字母,_或&開(kāi)頭(不能以數(shù)字開(kāi)頭)。
3, 除非加上“f”,否則所有帶小數(shù)點(diǎn)的值在Java里面都看作double類型。
4, Primitive主數(shù)據(jù)類型變量值是該值的字節(jié)所表示的。
5, 引用變量類似于指針,儲(chǔ)存的是引用對(duì)象的地址(儲(chǔ)存方式)。
6, 圓點(diǎn)運(yùn)算符(.)表示“取得圓點(diǎn)前面的對(duì)象,然后求出該對(duì)象在圓點(diǎn)后面的事物”。
7, 當(dāng)一個(gè)對(duì)象失去所有的引用變量時(shí),它就完蛋了。
8, 數(shù)組是對(duì)象,無(wú)論它里面裝的是不是primitive類型。
第四章 對(duì)象的行為(方法操作實(shí)例變量)
一開(kāi)始那張圖片,我每次看到都想笑(那貨的表情和動(dòng)作都太到位了= =后面一頁(yè)的*號(hào)冷笑話也很強(qiáng)大~)。咳咳,這章主要是圍繞對(duì)象的方法來(lái)闡述一些拓展技巧。
1, 根據(jù)傳入的實(shí)參(arguments)或者對(duì)象的實(shí)例變量(instance variable)的不同,同一個(gè)方法在同類型的不同的對(duì)象可以有著不同的表現(xiàn)形式。
2, 實(shí)參(arguments)是傳給方法的實(shí)際值,傳入方法后就變成了形參。形參(parameters)與局部變量(local)類似是一樣的。改變形參并不改變實(shí)參。(跟C一樣)傳入與返回的參數(shù)的值的類型可以隱含地放大或者明確地縮小。
3,
可以從方法里面返回值,聲明了返回最好要返回(我敲代碼時(shí)發(fā)覺(jué)時(shí)聲明了返回不返回會(huì)報(bào)錯(cuò)的,但P78最后一個(gè)問(wèn)題的回答并不是這樣的••囧),一般情況下
只能返回一個(gè)值,但是可以返回一個(gè)數(shù)組,再深一層的,可以返回ArrayList,換言之,只要你封裝好了,可以返回任意數(shù)量任意類型的任意變量的任意組
合。(這也太強(qiáng)大了吧•••)
4, Java是傳值調(diào)用(pass by value),如果調(diào)用的實(shí)參是個(gè)引用變量,同樣拷貝之。
5,
用setter(mutator)和getter(accessor)進(jìn)行封裝(encapsulation),可以保證對(duì)象的實(shí)例變量可以通過(guò)設(shè)置
setter來(lái)防止被惡搞。(用private設(shè)置實(shí)例變量,用public來(lái)設(shè)置setter和getter)這樣讀取和更改實(shí)例變量的效率會(huì)變低,不
過(guò)能夠提高程序的抵抗力抗性和恢復(fù)力抗性。
6, 實(shí)例變量有默認(rèn)值(整形為0,浮點(diǎn)型為0.0,布爾型為false),局部變量沒(méi)有默認(rèn)值,使用前需要初始化。
7, 使用==來(lái)比較兩個(gè)primitive主數(shù)據(jù)類型或者兩個(gè)引用是否引用到同一個(gè)對(duì)象。使用equals()來(lái)判斷兩個(gè)對(duì)象是否在意義上相等。(關(guān)于“在意義上”的概念需要斟酌,目前主要用于比較String類型是否相等)。
第五章 超強(qiáng)力方法(編寫(xiě)程序)
通過(guò)設(shè)計(jì)一個(gè)SimpleDotComGame大致地說(shuō)明了程序設(shè)計(jì)與實(shí)現(xiàn)的步驟。
1, 程序設(shè)計(jì)的第一步是高層設(shè)計(jì),把程序的基本架構(gòu)抽象出來(lái)。(想起了萬(wàn)惡的NS圖)
2,
第二步,根據(jù)基本架構(gòu)來(lái)構(gòu)思需要什么對(duì)象,需要實(shí)現(xiàn)什么類。(這是與面向過(guò)程不一樣的地方,但某程度上類的方法有點(diǎn)像面向過(guò)程中的過(guò)程函數(shù)的一部
分,Java優(yōu)勝在那強(qiáng)大的類的獨(dú)立性)。書(shū)本上提議開(kāi)發(fā)類的過(guò)程是:找出類應(yīng)該做的事情->列出實(shí)例變量和方法->編寫(xiě)方法的偽代碼
->編寫(xiě)方法的測(cè)試用程序->實(shí)現(xiàn)類->測(cè)試方法->出錯(cuò)或重新設(shè)計(jì)->邀請(qǐng)辣妹參加慶功派對(duì)(= =這什么啊?)
3, 偽碼,描述要做什么而不是怎么做的類文字,書(shū)上的偽碼都是全英文的,壓力很大,不過(guò)估計(jì)以后也要習(xí)慣了,因?yàn)楦杏X(jué)上計(jì)算機(jī)方面比較好的書(shū)都是外國(guó)的。測(cè)試碼,寫(xiě)在真實(shí)碼之前(因?yàn)檎鎸?shí)碼都寫(xiě)出來(lái)了估計(jì)就沒(méi)動(dòng)力寫(xiě)測(cè)試碼了),目的是為了寫(xiě)好真實(shí)碼之后測(cè)試真實(shí)碼。
4, 書(shū)本后面介紹了幾個(gè)技巧:加強(qiáng)版的for(要先把環(huán)境參數(shù)調(diào)到1.5以上才能用);把字符串轉(zhuǎn)換成整形的Integer.parseInt(String);還有C里面學(xué)習(xí)過(guò)的后遞增和break語(yǔ)句。
第六章 使用Java函數(shù)庫(kù) (認(rèn)識(shí)Java的API)
這章的頁(yè)數(shù)很多,把第五章的游戲排BUG之后又升級(jí)到高級(jí)版(依然無(wú)界面)。之后介紹了Java API的用途和用法。
1,排BUG過(guò)程中書(shū)本引入了強(qiáng)大ArrayList對(duì)象,這個(gè)對(duì)象很牛地,有著類似數(shù)組的簡(jiǎn)易操作性的同時(shí)有著類似鏈表的動(dòng)態(tài)伸縮性,代價(jià)是它耗費(fèi)的資源多一點(diǎn)。(對(duì)于add(index, Object)這個(gè)方法,index的值與之前的值不能跳空)
2,制作高級(jí)版時(shí),書(shū)本用一堆球和杯子加遙控器的組合強(qiáng)調(diào)了Java是個(gè)面向?qū)ο蟮木幊坦ぞ摺?
3,接著寫(xiě)到了一些布爾表達(dá)式的運(yùn)算符,跟C一樣,所以沒(méi)有壓力。
4, Java API中類是被包裝在包中的;使用是必須使用import或者在出現(xiàn)的每個(gè)位置寫(xiě)出全稱(除了java.lang包中的類);關(guān)于java和javax的趣聞;關(guān)于查詢API給出了查閱參考書(shū)和查閱HTML API文檔(真希望能具體點(diǎn))。
第七章 對(duì)象村的優(yōu)質(zhì)生活(繼承與多態(tài))
我認(rèn)為繼承和覆蓋是前十二章里面Java里面最強(qiáng)大的機(jī)制,拓展性,獨(dú)立性,適應(yīng)性,易改性•••多態(tài)什么的就是為了配合這個(gè)強(qiáng)大的機(jī)制而存在的。
1,
關(guān)于方法的繼承(inheritance)與覆蓋(override),書(shū)上說(shuō)得是很清楚的,子類可以繼承父類所有的非私有方法,也可以通過(guò)寫(xiě)出同名同參
數(shù)的方法來(lái)覆蓋父類的方法。方法調(diào)用時(shí),遵循低階優(yōu)先原則。關(guān)于方法繼承,有一點(diǎn)要分辨清楚的,子類繼承了父類的方法,與把父類的方法的代碼拷貝一份到子
類的代碼中的意義是不一樣的,當(dāng)其他對(duì)象引用該方法時(shí),前者會(huì)跳入父類中進(jìn)行調(diào)用,后者會(huì)跳入子類中進(jìn)行調(diào)用(因?yàn)榉椒ㄒ呀?jīng)被覆蓋了)。兩者的主要差別是
如果兩者有著同名的實(shí)例變量,方法中又涉及了該實(shí)例變量,就會(huì)產(chǎn)生不同的結(jié)果。即使它們共用同一個(gè)實(shí)例變量,這點(diǎn)上的模糊也通常會(huì)導(dǎo)致方法返回一個(gè)跟預(yù)想
不一樣的值或者產(chǎn)生一個(gè)預(yù)料未及的結(jié)果。關(guān)于實(shí)例變量的繼承與覆蓋,書(shū)上說(shuō)得一般清楚,所以后來(lái)編碼這一直弄得我好糾結(jié)。現(xiàn)在稍微清晰了一點(diǎn),但也不保證
我的理解是正確的,寄希望于下一本教材吧。上機(jī)操作后,我感覺(jué)“覆蓋”這個(gè)概念對(duì)于實(shí)例變量來(lái)說(shuō)不適用,“繼承”還有有那點(diǎn)意思的,若子類里面沒(méi)有新建同
名的實(shí)例變量,類似于方法的繼承,同樣不能理解成把父類的關(guān)于實(shí)例變量的代碼拷貝一份到子類中去,調(diào)用時(shí),依然是通過(guò)調(diào)用父類的實(shí)例變量。而當(dāng)子類中存在
父類的同名實(shí)例變量時(shí),不會(huì)產(chǎn)生覆蓋,而且作為兩個(gè)毫不相干的變量各自獨(dú)自地存在于所屬的類中,調(diào)用的時(shí)候根據(jù)引用的不同來(lái)區(qū)分。
2, 設(shè)計(jì)繼承樹(shù)的步驟:找出具有共同屬性和行為的對(duì)象(用繼承來(lái)防止子類中出現(xiàn)重復(fù)的程序代碼)->設(shè)計(jì)代表共同狀態(tài)與行為的類
->決定子類時(shí)候需要讓某項(xiàng)行為(也就是方法的實(shí)現(xiàn))有著特定不同的運(yùn)作方式->通過(guò)尋找使用共同行為的子類來(lái)找出更多抽象化的機(jī)會(huì)
->完成類的繼承層次。
3, 判斷選擇繼承還是看作實(shí)例變量的方法:“是一個(gè)”(IS-A)和“有一個(gè)”(HAS-A)。
4,
一些關(guān)于方法繼承的細(xì)節(jié):繼承單向性(因而有了IS-A的單向性),父類無(wú)法繼承子類的方法;子類中可以用super()來(lái)引用父類的方法;public
類型的成員會(huì)被繼承,private類型的成員不會(huì)被繼承;x extends y && y extends z ---> x
extends
z,就是說(shuō),x可以通過(guò)z的IS-A測(cè)試;繼承可以減少重復(fù)代碼,當(dāng)要修改方法時(shí),只要父類的參數(shù)沒(méi)有改變,子類都不需要改動(dòng)就能直接繼承;繼承定義出共
同的協(xié)議,也就是說(shuō),繼承可以確保某個(gè)父類之下所有子類都會(huì)有父類所持有的全部可繼承方法;可以用final來(lái)標(biāo)記類使它或者把里面的實(shí)例變量和方法標(biāo)記
成private來(lái)拒絕被繼承;在不知道父類源代碼僅知道其方法關(guān)鍵字的時(shí)候,可以通過(guò)繼承的方法來(lái)設(shè)計(jì)功能有所延展的子類。
5,
多態(tài)(polymorphism):當(dāng)定義一組類的父型時(shí),可以用子型的任何類來(lái)填補(bǔ)任何需要或期待父型的位置。換句話說(shuō),運(yùn)用多態(tài)時(shí),引用類型可以是實(shí)
際對(duì)象類型的父類,這樣的話,參數(shù)和返回類型都可以多態(tài)化處理。其中有一點(diǎn)是要特別注意的,當(dāng)一個(gè)對(duì)象實(shí)質(zhì)是子類但它的引用對(duì)象是子類的父類時(shí),雖然它本
質(zhì)是子類但它卻不能調(diào)用子類中的任何東西,Java看重的是引用類型,也就是說(shuō)此對(duì)象只能引用父型中的東西,但可以通過(guò)用子類的強(qiáng)制轉(zhuǎn)換符來(lái)把引用轉(zhuǎn)換成
子類。
6,
最后談?wù)劯采w和重載,子類同名方法未必就能覆蓋掉父類的方法:連參數(shù)類型和數(shù)目都相同時(shí)叫覆蓋,稍有不同就叫重載。重載之間毫無(wú)聯(lián)系,各自獨(dú)立存
在,JVM會(huì)根據(jù)參數(shù)的差別自行決定調(diào)用哪個(gè)重載的方法。最后是關(guān)于覆蓋和重載的一些細(xì)節(jié)上的區(qū)分:覆蓋(override),參數(shù)必須要一樣,其返回類
型必須要兼容;不能降低方法的存取權(quán)限。重載(overload),返回類型可以不同;不能只改變返回類型(參數(shù)在類型和數(shù)目上至少要稍有不同);可以更
改存取權(quán)限(因?yàn)橄嗷オ?dú)立)。
第八章 深入多態(tài)(接口與抽象類)
這章繼續(xù)討論多態(tài),書(shū)上說(shuō)沒(méi)有接口活不下去,現(xiàn)在有點(diǎn)體會(huì)。Java子類有時(shí)候扮演著不同的角色,這時(shí)候就需要用到接口了,因?yàn)楦割愔荒苡幸粋€(gè),但是接口的話就沒(méi)有這個(gè)限制了。
1,抽象類(abstract
class):有一些類在理論上是不應(yīng)該被初始化的,這時(shí)候加上abstract關(guān)鍵字可以防止它被new出來(lái)。抽象類的作用就是在防止被初始化之余能被
繼承以維持多態(tài)。(*書(shū)上提到特例:抽象類可以有static成員,目前不明白)。抽象類必須要被extends。
2,抽象的方法:抽象的方法沒(méi)有實(shí)體,因而一定要被覆蓋,即必須要實(shí)現(xiàn)所有抽象的方法。當(dāng)聲明了一個(gè)抽象的方法時(shí),該類必須標(biāo)記成抽象類(我理解成這是要通過(guò)強(qiáng)迫設(shè)置子類繼承來(lái)實(shí)現(xiàn)方法的覆蓋)。
3,萬(wàn)用類Object:所有類的父類;書(shū)上介紹的四個(gè)方
法:equals(),hashCode(),getClass(),toString();Object的作用是為多態(tài)提供一個(gè)萬(wàn)能模板,因而同樣要注
意到Object類型的變量只能做Object類里面的方法,要使用子類的方法,只能通過(guò)強(qiáng)制轉(zhuǎn)換符(再次強(qiáng)調(diào)Java很注重引用變量的類型:“編譯器是
根據(jù)引用類型來(lái)判斷有哪些method可以調(diào)用,而不是根據(jù)Object確實(shí)的類型。”);而理所當(dāng)然地,任何對(duì)象都可以使用Object里面的方法。
4,書(shū)本再再再次強(qiáng)調(diào)了Java很注重引用變量的類型:只能在引用變量的類確實(shí)有該方法才能夠調(diào)用它;把類的公有方法當(dāng)做是合約的內(nèi)容,合約是你對(duì)其他程序的承諾協(xié)議。
5,
接口(interface):本質(zhì)上是一個(gè)公用的且里面都是抽象的方法的抽象類。目的是為了讓對(duì)象從單一的父子類關(guān)系中得到拓展以在保持對(duì)象獨(dú)立性和脈絡(luò)
清晰性的同時(shí)得到多重身份。一言蔽之,接口就是為多態(tài)而存在的(不知這樣說(shuō)會(huì)不會(huì)太絕對(duì)呢=
=)。接口可以跨越不同的繼承樹(shù)進(jìn)行延展,同一對(duì)象也可以接上任意的接口。
第九章 對(duì)象的前世今生(構(gòu)造器與垃圾收集器)
這章的冷笑話和配圖是前九章里面最到位的一章,- -吐槽乏力了••正如標(biāo)題所言,這張說(shuō)的是構(gòu)造器(constructors)和垃圾收集器(garbage collection)。
1,關(guān)于生存空間和生存周期(life)和作用域(scope)什么的,學(xué)過(guò)C的表示沒(méi)有壓力。所有的對(duì)象生存在堆(heap)中,方法調(diào)用
和局部變量生存在棧(stack)上,而實(shí)例變量是生存在其依附的對(duì)象上,即也屬于堆中。關(guān)于棧,遵循后進(jìn)先出原則,關(guān)于各種引用變量,局部引用變量存在
于棧,實(shí)例引用變量存在于堆,儲(chǔ)存的自然只是存取方式。
2,構(gòu)造函數(shù)(constructor):一項(xiàng)關(guān)鍵特征是它不會(huì)有返回類型(包括void),另一項(xiàng)關(guān)鍵特征是它會(huì)在對(duì)象能后被賦值給引用之
前就執(zhí)行。一些構(gòu)造函數(shù)的應(yīng)用細(xì)節(jié):可以使用構(gòu)造函數(shù)來(lái)初始化對(duì)象的實(shí)例變量,如果有提供默認(rèn)值的要求,還可以通過(guò)重載構(gòu)造函數(shù)來(lái)滿足,而且最后在無(wú)參數(shù)
的構(gòu)造函數(shù)中設(shè)定一個(gè)默認(rèn)值;編譯器會(huì)幫你自動(dòng)補(bǔ)全,前提是你沒(méi)有寫(xiě)任何一個(gè)構(gòu)造函數(shù)。
3,構(gòu)造函數(shù)與父類之間的關(guān)系,這個(gè)確實(shí)有點(diǎn)糾結(jié):由于子類都包含了父類的實(shí)例變量,所以當(dāng)子類的繼承函數(shù)執(zhí)行前,必須先執(zhí)行父類的繼承函
數(shù),直至最后執(zhí)行Object的構(gòu)造函數(shù),這個(gè)過(guò)程成為“構(gòu)造函數(shù)鏈”(constructor
chaining);調(diào)用父類的構(gòu)造函數(shù)用super(),調(diào)用類中的重載構(gòu)造函數(shù)用this(),而由于super()和this()語(yǔ)法上都要求放在
構(gòu)造函數(shù)的第一行,所以它們不能同時(shí)使用。
4,關(guān)于垃圾收集器的工作機(jī)理:當(dāng)對(duì)象失去最后一個(gè)引用變量時(shí),它失去存在的意義,等待的就是被回收的命運(yùn)。關(guān)于引用變量的生存周期,局部引
用變量生存與方法當(dāng)中,方法結(jié)束,引用就消失;實(shí)例引用變量的生存周期與它存在的類的生存周期一樣,換句話說(shuō),他倆的生死大權(quán)在類的引用變量上,死去的方
法有“引用永久性的離開(kāi)它的范圍”“引用被賦值到其他的對(duì)象中”“直接將引用設(shè)定為null”。
第十章 數(shù)字很重要(數(shù)字和靜態(tài))
靜態(tài)什么的到現(xiàn)在依然不是很理解,很頭痛。介紹完靜態(tài)之后就是一些對(duì)數(shù)字,格式化,日期等之流的介紹,大概瀏覽了下。
1,
靜態(tài)的方法通常是實(shí)用的方法,不依賴對(duì)象的實(shí)例變量(可理解成語(yǔ)句獨(dú)立性很強(qiáng),不依賴前后的語(yǔ)句),因而不需要建立對(duì)象(并且通常構(gòu)造函數(shù)私有化來(lái)阻止用
戶創(chuàng)建實(shí)例)。引用時(shí)用類的名字來(lái)引用即可。又因?yàn)殪o態(tài)方法引用對(duì)象的是類,所以靜態(tài)方法是不可及調(diào)用同一個(gè)類中的非靜態(tài)的實(shí)例變量(因?yàn)闊o(wú)法識(shí)別應(yīng)該調(diào)
用那個(gè)對(duì)象的的變量,類似的理由,靜態(tài)方法也不能調(diào)用同一個(gè)類中非靜態(tài)方法),只可以調(diào)用靜態(tài)實(shí)例變量(因?yàn)橥惖膶?duì)象共享同一個(gè)靜態(tài)實(shí)例對(duì)象,不存在混
淆的問(wèn)題)
2, 靜態(tài)變量具有共享的特性,在類被加載時(shí)初始化(優(yōu)先于構(gòu)造函數(shù),并在所有靜態(tài)方法開(kāi)始前初始化)。如果即將運(yùn)行靜態(tài)方法前還沒(méi)有賦初值,自動(dòng)設(shè)為默認(rèn)值,整形為0,浮點(diǎn)型為0.0,布爾型為false,引用變量為null。
3, Java中的常數(shù):用public static final來(lái)修飾,即具有“公用”“免實(shí)例”“不變”的特性。
4, final:用于變量時(shí),變量不可改變值(定義時(shí)貌似必須初始化);用于方法時(shí),方法無(wú)法被覆蓋;用于類時(shí),類無(wú)法被繼承。名副其實(shí)的終結(jié)者。(注:final的類沒(méi)必要再定義final的方法,無(wú)法繼承根本不存在方法被覆蓋的問(wèn)題。)
5,
primitive主數(shù)據(jù)類型的包裝:1.5之后有了自動(dòng)包裝和解包(autoboxing),一切都變得很美好。基本可以無(wú)視int和Integer的
差別了,直接套用就是了,強(qiáng)大無(wú)比的實(shí)。用性。(目前發(fā)現(xiàn)不可套用的是ArrayList中的contains方法,需要用到強(qiáng)制轉(zhuǎn)換符。)后面提到了包
裝的實(shí)用性方法:parseInt(),parseDouble(),booleanValue(),toString()等。
6, 數(shù)字的格式化:學(xué)過(guò)C的表示繼續(xù)沒(méi)有壓力。%[argument number][flags][width][.precision]type這個(gè)寫(xiě)得好專業(yè)就收錄下來(lái)了,其他看書(shū)OK。
7, 日期的表示法和計(jì)算法:這個(gè)看書(shū)吧= =(import java.util.Date;import java.util.Calendar)
8, 最后一點(diǎn),靜態(tài)的import,這個(gè)我覺(jué)得作用不大,為少翹一點(diǎn)代碼而降低程序的易讀性很不劃算。
第十一章 有風(fēng)險(xiǎn)的行為(異常處理)
開(kāi)始介紹如何編寫(xiě)軟件,很激動(dòng)~這章主要說(shuō)異常處理(exception handling)和MIDI(musical instrument digital interface)播放相關(guān)。
1,
異常處理:除了RuntimeException和它的子類(一般是可以在編譯階段排除的語(yǔ)法錯(cuò)誤),其他異常(exception)都要進(jìn)行處理(或者
duck掉給調(diào)用者處理)。處理方法使用try{}和catch{}語(yǔ)句。(選擇性加上finally{},兩者至少要有一個(gè)。)如果不想在當(dāng)前處理,可
以用throws標(biāo)識(shí)方法來(lái)duck給此方法的調(diào)用者,調(diào)用者也可以進(jìn)一步duck給上一級(jí)調(diào)用者。如果連main()函數(shù)也ducking,那么JVM
就會(huì)死掉。一些細(xì)節(jié):try的時(shí)候遇到異常后立即跳到catch(如果有的話),否則運(yùn)行finally(如果有的話),之后拋出錯(cuò)誤(如果有
throws后綴的話);一個(gè)try后面可以多個(gè)catch,平行關(guān)系的異常,可以不管先后順序,父子關(guān)系的異常,子型放在父型之上。
2, MIDI(import
javax.sound.midi.*;):本身不帶有音樂(lè)信息,上面帶的是如何播放音樂(lè)的信息,跟樂(lè)譜差不多,所以占用空間很小。播放音樂(lè)的層
次:Sequencer(播放器)->Sequence(CD盤(pán))->Track(單曲)->MidiEvent(音符)。構(gòu)建的五個(gè)
步驟:取得Sequencer并將它打開(kāi)->創(chuàng)建新的Sequence->從Sequence中創(chuàng)建新的Track->填入
MidiEvent并讓Sequencer播放->按下play鍵。然后是各種的方法和各種的參數(shù),各種看書(shū)和查閱JAVA
API(MIDI的參數(shù)表至今沒(méi)有找到)。
第十二章 看圖說(shuō)故事(圖形用戶接口)
這章主要介紹了GUI(Graphical User Interface):制作窗口和按鈕,簡(jiǎn)單繪圖和貼圖,簡(jiǎn)單的動(dòng)畫(huà)等等。
1,JFrame用于創(chuàng)建主框架,通過(guò)getContentPane()把JButton,JLabel等其他組件(widget)掛載在上面。(import javax.swing.*;其他方法和參數(shù)見(jiàn)書(shū)本或JAVA API)
2,事件源(event
source)本身是個(gè)對(duì)象(框架,按鈕,滾動(dòng)條等),把用戶的操作(點(diǎn)擊鼠標(biāo),按鍵等)轉(zhuǎn)換成事件(event),如果當(dāng)前事件源被一個(gè)或若干個(gè)監(jiān)聽(tīng)器
(listener)注冊(cè),那么它會(huì)把事件(event object)當(dāng)成參數(shù)返回到實(shí)現(xiàn)了對(duì)應(yīng)的監(jiān)聽(tīng)接口的對(duì)象上面。
3, 通過(guò)用子類繼承JPanel來(lái)掛圖和繪圖。掛圖和繪圖在類里面的paintComponent方法里面實(shí)現(xiàn)。繪圖的時(shí)機(jī)一般由系統(tǒng)決定,也可以通過(guò)repaint()命令來(lái)強(qiáng)制馬上重繪。
4, 內(nèi)部類(inner class):唯一綁定在第一個(gè)初始化自己的外部類上,綁定后不可更改綁定對(duì)象,可以使用外部所有的方法與變量,包括有私有標(biāo)識(shí)的。
5, Thread.sleep()用于短暫掛起線程。(C里面的Sleep()函數(shù)••)
6,
監(jiān)聽(tīng)MIDI文件的方法:注冊(cè)一個(gè)特殊編號(hào)的MIDI事件(看作ControllerEvent)插入到MIDI文件上所有含有NOTE
ON(第一個(gè)參數(shù)是144)標(biāo)志的節(jié)拍上,把ControllerEventListener注冊(cè)到sequence上,最后在帶有
ControllerEventListener()接口的controlChange(ShortMessage ev)方法上實(shí)現(xiàn)監(jiān)聽(tīng)后的響應(yīng)工作。
第十三章 運(yùn)用Swing(Swing)
篇幅比較短的一章,主要介紹了布局管理器(Layout Managers)。
1, 幾乎所有組件(Components,或widget)都能夠安置其他的組件,除了JFrame之外,交互組件于背景組件的差異不明顯(JPanel雖然一般都當(dāng)做背景來(lái)使用,但也可以像按鈕一樣注冊(cè)鼠標(biāo)點(diǎn)選的事件)
2, 布局管理器(Layout
Managers):通過(guò)一種交互的機(jī)制(人機(jī)交互,布局層次內(nèi)部的交互)自主決策組件布局的一類對(duì)象。決策時(shí)優(yōu)先遵循自己的布局策略,在不破壞自身布局
策略的前提下最大程序上滿足用戶提出的布局請(qǐng)求(也就是有時(shí)候會(huì)違反用戶的請(qǐng)求)。
3,
書(shū)上提到的三大布局管理器:BorderLayout(把背景組件分成東南西北中五個(gè)區(qū)域,優(yōu)先分配南北,然后東西,最后剩下的部分為中
間),F(xiàn)lowLayout(把組件從左到右地排列,并有自動(dòng)換行的機(jī)制),BoxLayout(把組件從上到下地排列,但不帶有自動(dòng)換行的機(jī)制)
4, 剩下的JTextArea,JScrollerPane等的方法和參數(shù)等可參看書(shū)本。
第十四章 保存對(duì)象(序列化和文件輸入/輸出)
終于到輸入輸出了,這一章的翻譯挺不到位,建議對(duì)照英文教材閱讀之。
1, Java數(shù)據(jù)輸出的兩種方法,只給Java讀取的話用序列化(serialization),如果要給其他程序讀取或使用,輸出純文本文件。
2, (import java.io;)一般來(lái)說(shuō),串流(stream)要連接流(connection
stream)和鏈接流(chain
stream)兩兩配合才能有效。其中連接流負(fù)責(zé)連接到文件,socket等,但因?yàn)樽陨硪话阒挥邢褫敵鲎止?jié)等低級(jí)方法,所以要借助較為高級(jí)的連接流中的
高級(jí)方法才能轉(zhuǎn)換成功。
3,
要一個(gè)類實(shí)現(xiàn)可序列化,需要實(shí)現(xiàn)Serializable接口。如果不想某個(gè)實(shí)例變量被序列化,標(biāo)記上transient(像網(wǎng)絡(luò)聯(lián)機(jī)這類隨機(jī)數(shù)據(jù)也應(yīng)該
標(biāo)記transient),考慮到要完整且正確地恢復(fù)到原狀態(tài)(所謂狀態(tài),一般就是指實(shí)例變量的值),序列化時(shí)候需要把與保存對(duì)象相關(guān)的所有對(duì)象形成的網(wǎng)
絡(luò)全部序列化保存(如果網(wǎng)絡(luò)中有一部分實(shí)例變量既沒(méi)有實(shí)現(xiàn)Serializable又沒(méi)有被標(biāo)記transient)。
4, 對(duì)于純文件的處理用FileWriter和FileReader,為提高效率,可以選擇使用BufferedReader和BufferedWriter
5, 剩下還有關(guān)于GUI和IO的很多類很多方法很多參數(shù),參看書(shū)本吧。
第十五章 網(wǎng)絡(luò)聯(lián)機(jī)(網(wǎng)絡(luò)與線程)
嘛,這章大致介紹了怎么實(shí)現(xiàn)網(wǎng)絡(luò)聯(lián)機(jī),還是就是一些多線程的細(xì)節(jié)問(wèn)題。
1, 聊天程序的工作方式:客戶端連接到服務(wù)器->服務(wù)器建立連接并把客戶端架到來(lái)并清單中->另外一個(gè)用戶連接上來(lái)->用戶A送出信息到聊天服務(wù)器上->服務(wù)器將信息送給所有的來(lái)賓(一開(kāi)始對(duì)最后一步有疑問(wèn),參看P488就恍然大悟了)
2, Java不需要注意太多細(xì)節(jié)的東西就可以架設(shè)好網(wǎng)絡(luò)連接(同時(shí)譯者提醒讀者不要把架設(shè)網(wǎng)絡(luò)想成是太簡(jiǎn)單的事情- -)
3, (import java.net.*;)建立socket連接,要知道IP地址和TCP的端口號(hào)。(本機(jī)IP地址為:127.0.0.1)
4,
關(guān)于網(wǎng)絡(luò)串流的讀寫(xiě):讀,服務(wù)器(server)->Socket輸入流
->InputStreamReader->BufferedReader->客戶端(client)。寫(xiě),客戶端
->PrintWriter->Socket輸出流->服務(wù)器。(不知道為什么中間不加BufferedWriter)
5, 多線程(multithreading):線程(thread)是一種獨(dú)立的執(zhí)行空間(a separate call stack),除非是多處理器,否則新線程并不是單獨(dú)運(yùn)行的線程,雖然感覺(jué)上是這樣。
6,
每個(gè)thread需要一個(gè)任務(wù)來(lái)執(zhí)行,一個(gè)可以放在執(zhí)行空間的任務(wù)(實(shí)現(xiàn)Runnable接口的中的run(),類似于主線程的main()方法)。線程
有“新建”“可執(zhí)行”“執(zhí)行中”三個(gè)狀態(tài),而且,一旦線程進(jìn)入了“可執(zhí)行”狀態(tài)后,它會(huì)在“可執(zhí)行”和“執(zhí)行中”兩種狀態(tài)中不停地切換(除非處于堵塞狀
態(tài))
7, 線程調(diào)度器(the thread scheduler):Java自帶的決定什么時(shí)候運(yùn)行哪個(gè)線程的一種機(jī)制,不受用戶的API的控制,所以調(diào)度結(jié)果無(wú)法確定(不同的機(jī)器有著不同的執(zhí)行過(guò)程,同一臺(tái)機(jī)器也會(huì)有著不同的執(zhí)行過(guò)程)。
8, 可以用sleep()方法來(lái)影響調(diào)度器,不過(guò)作用效果一般沒(méi)有想象中要好。
9, 并發(fā)性問(wèn)題(concurrency
issue):當(dāng)兩個(gè)或以上的線程存取單一對(duì)象的數(shù)據(jù)的時(shí)候,就有機(jī)會(huì)發(fā)生各種奇怪的錯(cuò)誤。為了排除這類問(wèn)題,使用synchronized(同步化過(guò)
的)標(biāo)志對(duì)象運(yùn)行中的那些不可分割的過(guò)程,類似于一把鎖,鎖住了儲(chǔ)存數(shù)據(jù)的方法,使一個(gè)對(duì)象對(duì)這個(gè)數(shù)據(jù)使用完畢之后再允許其他對(duì)象使用該數(shù)據(jù)。
第十六章 數(shù)據(jù)結(jié)構(gòu)(集合和泛型)
各種集合(collections)(目前在學(xué)C++版的數(shù)據(jù)結(jié)構(gòu)…討厭的課程)
1,
各種數(shù)據(jù)結(jié)構(gòu):TreeSet(有序防重復(fù)),HashMap(每個(gè)數(shù)據(jù)都有對(duì)應(yīng)的KEY值),LinkedList(大集合的快速插入和刪除中間元素,
這效果,有點(diǎn)像鏈表),HashSet(防重復(fù),可以快速尋找元素),LinkedHashMap(HashMap的升級(jí)版,具體看書(shū))。書(shū)本的說(shuō)法
是:list對(duì)付順序結(jié)構(gòu),set注重獨(dú)一無(wú)二的性質(zhì),map用key來(lái)搜索的專家。
2, 使用System.out.println集合的時(shí)候,要覆蓋集合元素的類中的public String toString()方法來(lái)設(shè)定輸出的內(nèi)容。
3,
使用Collection.sort(某集合)方法的時(shí)候,要求某集合的元素實(shí)現(xiàn)排序化(實(shí)現(xiàn)Comparable接口之下的public int
Compareto()方法),或者用sort的重載方法sort(某集合,某比較器),當(dāng)然之前要現(xiàn)實(shí)某比較器(Comparator)中的int
Compare()方法。
4,
關(guān)于泛型(generic):java5.0之后推出的功能,為了實(shí)現(xiàn)更好的類型安全性。一般用<T>表示,對(duì)于集合,也
用<E>來(lái)表示(E for
element),類型參數(shù)會(huì)被編譯器自動(dòng)識(shí)別和替換<T>或<E>的位置。然后public <T extends
Animal>void takeThing(ArrayList<T> list)跟public void
takeThing(ArrayList<Animal>
list)含義是不一樣的。還有,泛型里面的extends和implements其實(shí)都是is的意思,但是創(chuàng)造新的關(guān)鍵字會(huì)破壞之前的程序,所以沒(méi)有引
用is關(guān)鍵字。
5,
對(duì)象相等:包括引用相等性和對(duì)象相等性,前者指“堆上同一對(duì)象的兩個(gè)引用”,后者指“堆上的兩個(gè)不同對(duì)象在意義上是相同的”,一般需要的是后者,要實(shí)現(xiàn)后
者,就必須覆蓋從Object繼承下來(lái)的hashCode()和equals()方法。以HashSet為例,檢查兩個(gè)變量是否相等,首先檢查
hashCode()的返回是否一樣,然后再檢查equals()函數(shù)的返回是否是true。更加細(xì)節(jié)的東西:hashCode相同并不能保證對(duì)象相同
的,因?yàn)閔ashCode使用的是雜湊算法。還有就是覆蓋equals()方法是要注意它的參數(shù)是Object類型的。
6, TreeSet的元素必須實(shí)現(xiàn)Comparable或者在構(gòu)造的時(shí)候用comparator來(lái)初始化。
7,
然后是多態(tài)的問(wèn)題:不知出自什么原因,java設(shè)計(jì)時(shí)設(shè)定數(shù)組的類型檢查是在運(yùn)行使其進(jìn)行的,而集合的類型檢查只在編譯時(shí)期,所以多態(tài)在集合要實(shí)現(xiàn)要麻煩
些——public void takeAnimal(ArrayList<? extends
Animal>animals),注意這里的extends依然和implements一起都是is的意思。
第十七章 發(fā)布程序(包,jar存檔文件和部署)
文件部署,打包成jar什么的,我希望有懶人工具能幫忙打包。
1, 部署分成:完全在本機(jī)的Executable Jar,完全在遠(yuǎn)程的Servlets和介乎兩者之間的JWS(我愛(ài)翻譯成“巨猥瑣”)。
2, 源代碼和類文件的分離:源代碼放在source,類文件放在classes,使用命令-d(書(shū)上說(shuō)-d懂的自己建立未建立的目錄,但貌似我這樣做時(shí)會(huì)提示出錯(cuò))
3,
打包JAR:首先,確認(rèn)所有的類文件都在classes目錄下,然后在該目錄下建立manifest.txt來(lái)指定哪個(gè)類帶有main()方法
(Main-Class: **),最后用jar命令打包。(jar –cvmf manifest.txt **.jar *.class)
4, 執(zhí)行JAR:在cmd下用java –jar
*.jar命令來(lái)啟動(dòng),如果自帶GUI,在windows環(huán)境下可以雙擊打開(kāi)。(若打開(kāi)是被winrar等程序干擾時(shí),打開(kāi)方式設(shè)為jre/bin下的
javaw.exe,然后在用regedit打開(kāi)注冊(cè)表,在HKEY_CLASSES_ROOT下找到.jar文件的打開(kāi)方法,在參數(shù)中間添加-jar字
樣)
5, 包:主要用于防止類名稱的沖突,關(guān)于制作包執(zhí)行包用包弄JAR等具體命令參看P589左右(懶人表示期待工具)
6, Java web start(JWS):書(shū)本介紹較為簡(jiǎn)單,還夾雜著XML的語(yǔ)言…
第十八章 分布式計(jì)算(遠(yuǎn)程部署的RMI)
終于最后一章了,最后幾章的難度明顯加大呢,可能是因?yàn)樽詈髱渍律婕奥?lián)網(wǎng)什么的,那貨其實(shí)都可以展開(kāi)寫(xiě)一本書(shū)了。
1, RMI(remote method
invocation):一種連接客戶端和服務(wù)器的技術(shù)(有點(diǎn)像socket)。事實(shí)上,在某堆上的對(duì)象無(wú)法進(jìn)行另外堆上的對(duì)象引用,但是利用RMI能夠
模擬這種感覺(jué)。實(shí)現(xiàn)需要四個(gè)部分:服務(wù)器(server),客戶端(client),服務(wù)器輔助設(shè)施(server
helper),客戶端輔助設(shè)施(client
helper)。客戶端調(diào)用客戶端輔助設(shè)施來(lái)模擬調(diào)用本機(jī)對(duì)象的感覺(jué),而實(shí)際上客戶端輔助設(shè)施只是作為代理(proxy),真正實(shí)現(xiàn)客戶端請(qǐng)求的是服務(wù)
器。
2, RMI調(diào)用方法的過(guò)程:客戶端對(duì)象對(duì)輔助設(shè)置對(duì)象調(diào)用方法(已注冊(cè)的方法)->客戶端輔助設(shè)施把調(diào)用信息打包通過(guò)網(wǎng)絡(luò)送到服務(wù)器的輔助設(shè)施->服務(wù)端的輔助設(shè)施解開(kāi)來(lái)自客戶端輔助設(shè)施的信息,并以此調(diào)用真正的服務(wù)。
3,
創(chuàng)建RMI遠(yuǎn)程服務(wù):步驟一:創(chuàng)建Remote接口(繼承java.rmi.Remote;生命所有的方法都會(huì)拋出RemoteException;確定
參數(shù)和返回值都是primitive主數(shù)據(jù)類型或者Serializable);步驟二:實(shí)現(xiàn)Remote(實(shí)現(xiàn)Remote這個(gè)接口;繼承
UnicastRemoteObject;編寫(xiě)聲明RemoteExceiption的無(wú)參數(shù)構(gòu)造函數(shù);向RMI
registry注冊(cè)服務(wù));步驟三:用rmic產(chǎn)生stub與skeleton(對(duì)實(shí)現(xiàn)出的類(不是Remote接口)執(zhí)行rmic);步驟四:?jiǎn)?dòng)
RMI registry(調(diào)出命令行來(lái)啟動(dòng)RMI registry);步驟五:?jiǎn)?dòng)遠(yuǎn)程服務(wù)(調(diào)用另一個(gè)命令行來(lái)啟動(dòng)服務(wù))
4, Servlet:servlet是完全放在HTTP
WEB服務(wù)器上運(yùn)行的JAVA程序,用于應(yīng)付用戶端沒(méi)有JAVA虛擬機(jī)的情況。創(chuàng)建并執(zhí)行servlet的步驟:找出可以存放servlet的地方(就是
要買(mǎi)個(gè)服務(wù)器);取得servlets.jar并添加到classpath上(上sun官網(wǎng)掛之);通過(guò)extend過(guò)HttpServlet來(lái)編寫(xiě)
servlet的類;編寫(xiě)HTML來(lái)調(diào)用servlet(我不會(huì)••);給服務(wù)器設(shè)定HTML的網(wǎng)頁(yè)和servlet。
5, JINI(Java Intelligent Network
Infrastructure):傳說(shuō)中一個(gè)更加強(qiáng)大的RMI,帶有自適應(yīng)探索(adaptive
discovery)和自恢復(fù)網(wǎng)絡(luò)(self-healing
networks)。因?yàn)楹軓?qiáng)大,所以書(shū)上也沒(méi)有篇幅去細(xì)說(shuō)。后面是實(shí)現(xiàn)方法和一堆堆代碼,看得我產(chǎn)生了嚴(yán)重的抵觸情緒。
最后是附錄AB:beatbox的最終版和十大遺珠之憾。
- -留著以后看吧,連滾帶爬的,算是把這本書(shū)看完了。
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
管理
|
||