




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java高級(jí)程序設(shè)計(jì)第1章 Java編碼規(guī)范1.1 應(yīng)用場(chǎng)景1.2 相關(guān)知識(shí)1.3 任務(wù)實(shí)施1.4 拓展知識(shí)1.5 拓展訓(xùn)練1.6課后小結(jié)1.1 應(yīng)用場(chǎng)景 一個(gè)大型的軟件項(xiàng)目是由一個(gè)團(tuán)隊(duì)來(lái)完成的,每個(gè)程序員在給包、類、 變量、方法取名的時(shí)候,如果根本沒(méi)有一點(diǎn)約定,只是隨心所欲,可能會(huì)帶來(lái)一系列問(wèn)題。 編碼規(guī)范是程序編碼所要遵循的規(guī)則,保證代碼的正確性、穩(wěn)定性、可讀性。規(guī)范編碼有以下作用。一、規(guī)范的代碼可以促進(jìn)團(tuán)隊(duì)合作二、規(guī)范的代碼可以減少bug處理三、規(guī)范的代碼可以降低維護(hù)成本四、規(guī)范的代碼有助于代碼審查五、養(yǎng)成代碼規(guī)范的習(xí)慣,有助于程序員自身的成長(zhǎng)1.2 相關(guān)知識(shí)1.2.1 文件后綴名1.2
2、.2 源文件樣式約定1.2.3 注釋規(guī)范1.2.4 命名規(guī)范1.2.1 文件后綴名表1-1 Java程序使用的文件后綴名 文件類別文件后綴名Java源文件.javaJava字節(jié)碼文件.class其中兩者最本質(zhì)的區(qū)別在于,.Java文件是供虛擬機(jī)運(yùn)行時(shí)執(zhí)行的文件,而.class文件可以讓你在任何一臺(tái)安裝了Java虛擬機(jī)的機(jī)器上運(yùn)行。1.2.2 源文件樣式約定Java源文件必須按順序由以下3部分組成。1、版權(quán)信息。2、包和引入語(yǔ)句。3、類和接口聲明。1. 版權(quán)信息版權(quán)和版本信息必須在Java文件的開(kāi)頭,其他不需要出現(xiàn)在javadoc的信息也可以包含在這里。2. 包和引入語(yǔ)句package 行要在i
3、mport行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個(gè)包中的不同子目錄,則應(yīng)該用 * 來(lái)處理。3. 類和接口聲明每個(gè)Java源文件都包含一個(gè)單一的公共類或接口。1.2.3 注釋規(guī)范1.注釋編寫的原則(1)注釋形式統(tǒng)一。在整個(gè)應(yīng)用程序中,使用具有一致的標(biāo)點(diǎn)和結(jié)構(gòu)的樣式來(lái)構(gòu)造注釋。如果在其他項(xiàng)目中發(fā)現(xiàn)它們的注釋規(guī)范與這份文檔不同,按照這份規(guī)范寫代碼,不要試圖在既成的規(guī)范系統(tǒng)中引入新的規(guī)范。(2)注釋內(nèi)容準(zhǔn)確簡(jiǎn)潔。內(nèi)容要簡(jiǎn)單、明了、含義準(zhǔn)確,防止注釋的多義性,錯(cuò)誤的注釋不但無(wú)益反而有害。2.注釋類型的基本劃分(1)基本注釋必須要添加
4、,包括以下幾種: 1、類(接口)的注釋; 2、構(gòu)造函數(shù)的注釋; 3、方法的注釋; 4、全局變量的注釋; 5、字段/屬性的注釋;簡(jiǎn)單的代碼做簡(jiǎn)單注釋,注釋內(nèi)容不大于10個(gè)字即可,另外,持久化對(duì)象或VO對(duì)象的getter、setter方法不需加注釋。(2)特殊必加的注釋包括以下幾種:1、典型算法必須有注釋。2、在代碼不明晰處必須有注釋。3、在代碼修改處加上修改標(biāo)識(shí)的注釋。4、在循環(huán)和邏輯分支組成的代碼中加注釋。5、為他人提供的接口必須加詳細(xì)注釋。具體的注釋格式自行定義,要求注釋內(nèi)容準(zhǔn)確簡(jiǎn)潔。3.注釋的格式(1)單行(single-line)注釋格式為“/”。(2)塊(block)注釋格式為“/*/
5、”。(3)文檔注釋格式為“/*/”。(4)Javadoc注釋標(biāo)簽語(yǔ)法如下:author 對(duì)類的說(shuō)明,標(biāo)明開(kāi)發(fā)該類模塊的作者;version 對(duì)類的說(shuō)明,標(biāo)明該類模塊的版本;see 對(duì)類、屬性、方法的說(shuō)明,參考轉(zhuǎn)向,也就是相關(guān)主題;param 對(duì)方法的說(shuō)明,對(duì)方法中某參數(shù)的說(shuō)明;return 對(duì)方法的說(shuō)明,對(duì)方法返回值的說(shuō)明;exception 對(duì)方法的說(shuō)明,對(duì)方法可能拋出的異常進(jìn)行說(shuō)明。1.2.4 命名規(guī)范命名指系統(tǒng)中對(duì)包名、目錄(類名)、方法、常量、變量等標(biāo)識(shí)符的命名。標(biāo)識(shí)符的命名力求做到統(tǒng)一、達(dá)意、簡(jiǎn)潔,遵循駝峰法則。統(tǒng)一是指對(duì)于同一個(gè)概念,在程序中用同一種表示方法。例如對(duì)于供應(yīng)商,既可以
6、用supplier,也可以用provider,但是我們只能選定一個(gè)使用,至少在一個(gè)Java項(xiàng)目中保持統(tǒng)一。達(dá)意是指標(biāo)識(shí)符能準(zhǔn)確地表達(dá)出它所代表的意義,如newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等則不是好的命名方式。簡(jiǎn)潔是指,在統(tǒng)一和達(dá)意的前提下,用盡量少的標(biāo)識(shí)符。如果不能達(dá)意,寧愿不要太簡(jiǎn)潔。例如,theOrderNameOfTheTargetSupplierWhichIsTransfered 太長(zhǎng),transferedTargetSupplierOrderName則較好,但是transTgtSpl
7、OrdNm就不好了。省略元音的縮寫方式不要使用,我們的英語(yǔ)往往還沒(méi)有好到看得懂奇怪的縮寫。用駝峰法則是指單詞之間不使用特殊符號(hào)分割,而是通過(guò)首字母大寫來(lái)分割。例如推薦用 SupplierName, addNewContract,而不是supplier_name, add_new_contract。1.3 任務(wù)實(shí)施1.3.1 任務(wù)一 計(jì)算員工的月工資(1)任務(wù)需求某公司分為多個(gè)部門,每個(gè)部門有一個(gè)經(jīng)理和多個(gè)員工,每個(gè)員工根據(jù)職稱發(fā)基本工資。員工的工資按基本工資、日加班工資、日缺勤工資等組成。具體需求如下所示(1)員工的基本信息,部門、職務(wù)、職稱以及工資記錄等信息。(2)能記錄員工的每一個(gè)職稱信息
8、,并授予相應(yīng)的職稱,系統(tǒng)在 計(jì)算員工工資的時(shí)候選取職稱對(duì)應(yīng)的最高職稱津貼。(2)任務(wù)分析問(wèn)題域中涉及多個(gè)類,職員類Staffer,經(jīng)理類Manager,測(cè)試類TestEmployee。Staffer類:通過(guò)此類封裝定義計(jì)算員工基本工資方法Manager類:通過(guò)此類封裝定義計(jì)算員工基本工資方法TestEmployee類:調(diào)用方法并實(shí)現(xiàn)結(jié)果輸出1.4 拓展知識(shí)相對(duì)于之前所提到的一些基本的編程需要注意的慣例,其他慣例(Miscellaneous Practices)也是非常重要的,下面就列出相對(duì)應(yīng)的慣例:1.每次保存的時(shí)候,都讓你的代碼是最美的2. 使用log而不是System.out.printl
9、n()3. 每個(gè)if while for等語(yǔ)句,都不要省略大括號(hào)4. 善用TODO5. 在需要留空的地方放一個(gè)空語(yǔ)句或注釋6. 不要再對(duì)boolean值做true false判斷7. 減少代碼嵌套層次1.5 拓展訓(xùn)練 良好的編碼習(xí)慣可以大大提高可讀性以及編碼效率。請(qǐng)讀者從一開(kāi)始就養(yǎng)成一個(gè)良好的編碼習(xí)慣。通過(guò)以下校驗(yàn)郵件地址方法模板展示較為規(guī)范的編碼格式:1.6 課后小結(jié)1.規(guī)范需要平時(shí)編碼過(guò)程中注意,是一個(gè)慢慢養(yǎng)成的好習(xí)慣。2.命名規(guī)范。所有的標(biāo)識(shí)符只能用英文字母,數(shù)字,下劃線,并采用駝峰標(biāo)識(shí)。3.注釋規(guī)范。注釋有:?jiǎn)涡凶⑨?“/”, 多行注釋 “/*.*/”, 文檔注釋 “/*/”。4.排版
10、規(guī)范。代碼應(yīng)避免一行長(zhǎng)度超過(guò)60個(gè)字符。5.聲明規(guī)范。一行聲明一個(gè)變量,只在代碼塊的開(kāi)始處聲明變量。6.語(yǔ)句規(guī)范。一條語(yǔ)句占用一行。7.編程規(guī)范。用于設(shè)置的方法前綴必須是set;用于檢索一個(gè)布爾類型的方法前綴必須是is,而用于檢索其他方法前綴必須是get。程序中應(yīng)盡可能少使用數(shù)字(或字符),盡可能定義靜態(tài)變量來(lái)說(shuō)明該數(shù)字(或字符)的含義。1.7 課后習(xí)題 1. 相對(duì)獨(dú)立的程序塊之間、變量說(shuō)明之后必須加_。2. 類注釋部分,描述部分說(shuō)明該類或者接口的功能、作用、使用方法和注意事項(xiàng),每次修改后增加作者、新版本號(hào)和當(dāng)天的日期,since _,deprecated 表示_。3. 比較操作符,賦值操作符
11、=、+=,算術(shù)操作符+、%,邏輯操作符&、&,位域操作符、等雙目操作符的前后加_。4. Java中的注釋有三種形式: 文檔注釋 、 多行注釋 和_。5. 方法的文檔中,塊標(biāo)記param用于說(shuō)明_的含義,return用于說(shuō)明_1.下列錯(cuò)誤使用異常的做法是_。A.在程序中使用異常處理還是使用錯(cuò)誤返回碼處理,根據(jù)是否有利于程序結(jié)構(gòu)來(lái)確定,并且異常和錯(cuò)誤碼不應(yīng)該混合使用,推薦使用異常。B.一個(gè)方法不應(yīng)拋出太多類型的異常。throws/exception子句標(biāo)明的異常最好不要超過(guò)三個(gè)。C.異常捕獲盡量不要直接catch(Exceptionex),應(yīng)該把異常細(xì)分處理。D.程序內(nèi)拋出的異常本身就可說(shuō)明異常的
12、類型、拋出條件,可不填寫詳細(xì)的描述信息。捕獲異常后用exception.toString()取到詳細(xì)信息后保存。2下列說(shuō)法錯(cuò)誤的是_。A.段代碼各語(yǔ)句之間有實(shí)質(zhì)性關(guān)聯(lián)并且是完成同一件功能的,那么可考慮把此段代碼構(gòu)造成一個(gè)新的方法。B.源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。C.程序中可同時(shí)使用錯(cuò)誤碼和異常進(jìn)行處理,推薦使用異常。D.方法參數(shù)建議不超過(guò)5個(gè)。1.8 上機(jī)實(shí)訓(xùn)實(shí)訓(xùn)一、計(jì)算幾何圖形的面積、周長(zhǎng)。其類圖如1-1所示。Java高級(jí)程序設(shè)計(jì)第2章 Java集合框架2.1 應(yīng)用場(chǎng)景2.6 課后小結(jié)2.2 相關(guān)知識(shí) 2.7 課后習(xí)題2.3 實(shí)施過(guò)程2.8 上機(jī)實(shí)訓(xùn)2.4 拓展知識(shí)2.5 拓展訓(xùn)
13、練2.1 應(yīng)用場(chǎng)景在Java編程時(shí),常常需要集中存放多個(gè)數(shù)據(jù)。當(dāng)然我們可以使用數(shù)組來(lái)保存多個(gè)對(duì)象。但數(shù)組長(zhǎng)度不可變化;而且數(shù)組無(wú)法保存具有映射關(guān)系的數(shù)據(jù)。為了保存數(shù)量不確定的數(shù)據(jù),以及保存具有映射關(guān)系的數(shù)據(jù)(也被稱為關(guān)聯(lián)數(shù)組),就要使用Java提供的集合類。JDK提供了大量?jī)?yōu)秀的集合實(shí)現(xiàn)供開(kāi)發(fā)者使用,合格的程序員必須要能夠通過(guò)功能場(chǎng)景和性能需求選用最合適的集合,這就要求開(kāi)發(fā)者必須熟悉Java的常用集合框架類。2.2 相關(guān)知識(shí)2.2.1 集合框架2.2.2 Java集合框架2.3.3 Java集合框架的使用2.2.1 集合框架在現(xiàn)實(shí)生活中,集合被理解為:很多事物湊在一起;在。數(shù)學(xué)中,的集合:為具
14、有共同屬性的事物的總體。通常情況下,我們把具有相同性質(zhì)的一類東西,匯聚成一個(gè)整體,就可以稱為集合。通常集合有兩種表示法,一種是列舉法,比如集合A=1,2,3,4,另一種是性質(zhì)描述法,比如集合B=X|0X100且X屬于整數(shù)。集合論的奠基人康托爾在創(chuàng)建集合理論給出了許多公理和性質(zhì),這都成為后來(lái)集合在其他領(lǐng)域應(yīng)用的基礎(chǔ)。2.2.2 Java集合框架在Java語(yǔ)言中,Java語(yǔ)言的設(shè)計(jì)者對(duì)常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實(shí)現(xiàn)(具體實(shí)現(xiàn)接口的類)。所有抽象出來(lái)的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架(JavaCollectionFramework),。如圖2-1所示。2.2.3 Java
15、集合框架的使用Java程序員在具體應(yīng)用時(shí),不必考慮數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)現(xiàn)細(xì)節(jié),只需要用這些類創(chuàng)建出來(lái)一些對(duì)象,然后直接應(yīng)用就可以了,這樣就大大提高了編程效率。2.3 實(shí)施過(guò)程2.3.1 List的使用2.3.2 Set的使用2.3.3 Map的使用2.3.1 LIST的使用1.List接口List繼承自Collection接口。List是一種有序集合,List中的元素可以根據(jù)索引(順序號(hào):元素在集合中處于的位置信息)進(jìn)行取得/刪除/插入操作。跟Set集合不同的是,List允許有重復(fù)元素。對(duì)于滿足e1.equals(e2)條件的e1與e2對(duì)象元素,可以同時(shí)存在于List集合中。2.List實(shí)現(xiàn)類L
16、ist接口的實(shí)現(xiàn)類主要有ArrayList,LinkedList,Vector,Stack等。2.3.2 SET的使用1.Set接口Set 是繼承于Collection的接口。java中的set接口有如下的特點(diǎn):不允許出現(xiàn)重復(fù)元素;集合中的元素位置無(wú)順序;有且只有一個(gè)值為null的元素。2.Set接口的實(shí)現(xiàn)類實(shí)現(xiàn)了Set接口的主要有HashSet、TreeSet、LinkedHashSet。HashSet依賴于HashMap,它實(shí)際上是通過(guò)HashMap實(shí)現(xiàn)的。HashSet中的元素是無(wú)序的。TreeSet依賴于TreeMap,它實(shí)際上是通過(guò)TreeMap實(shí)現(xiàn)的。TreeSet中的元素是有序的
17、。2.3.3 MAP的使用1.Map接口Map提供了一種映射關(guān)系,其中的元素是以鍵值對(duì)(key-value)的形式存儲(chǔ)的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;。Map中的鍵值對(duì)以Entry類型的對(duì)象實(shí)例形式存在;。鍵建(key值)不可重復(fù),value值可以重復(fù),一個(gè)value值可以和很多key值形成對(duì)應(yīng)關(guān)系,每個(gè)鍵最多只能映射到一個(gè)值。Map支持泛型,形式如:Map。Map中使用put(K key,V value)方法添加。2.已知實(shí)現(xiàn)類在java.util包中接口 Map 存儲(chǔ)鍵值對(duì),作為一個(gè)元組存入。元組以鍵作為標(biāo)記,鍵相同時(shí),值覆蓋。類型參數(shù):K - 此映射所維護(hù)的鍵的類型;V - 映
18、射值的類型;其已知實(shí)現(xiàn)類:為HashMap、TreeMap。2.4 拓展知識(shí)1.Vector前面我們已經(jīng)提到,Java設(shè)計(jì)者們?cè)趯?duì)之前的容器類進(jìn)行重新設(shè)計(jì)時(shí)保留了一些數(shù)據(jù)結(jié)構(gòu),其中就有Vector。用法上,Vector與ArrayList基本一致,不同之處在于Vector使用了關(guān)鍵字synchronized,將訪問(wèn)和修改向量的方法都變成同步的了,所以對(duì)于不需要同步的應(yīng)用程序來(lái)說(shuō),類ArrayList比類Vector更高效。2.StackStack,棧類,是Java2之前引入的,繼承自類Vector。3.HashTableHashTable和前面介紹的HashMap很類似,它也是一個(gè)散列表,存儲(chǔ)
19、的內(nèi)容是鍵值對(duì)映射,不同之處在于,HashTable是繼承自Dictionary的,HashTable中的函數(shù)都是同步的,這意味著它也是線程安全的,另外,HashTable中key和value都不可以為null。上面的三個(gè)集合類都是在Java2之前推出的容器類,可以看到,盡管在使用中效率比較低,但是它們都是線程安全的。下面介紹兩個(gè)特殊的集合類。4.ConcurrentHashMapConcurrent,并發(fā),從名字就可以看出來(lái)ConcurrentHashMap是HashMap的線程安全版。同HashMap相比,ConcurrentHashMap不僅保證了訪問(wèn)的線程安全性,而且在效率上與Hash
20、Table相比,也有較大的提高。關(guān)于ConcurrentHashMap的設(shè)計(jì),我將會(huì)在下一篇關(guān)于并發(fā)編程的博客中介紹,敬請(qǐng)關(guān)注。5.CopyOnWriteArrayListCopyOnWriteArrayList,是一個(gè)線程安全的List接口的實(shí)現(xiàn),它使用了ReentrantLock鎖來(lái)保證在并發(fā)情況下提供高性能的并發(fā)讀取。2.5 拓展訓(xùn)練任務(wù)要求:實(shí)現(xiàn)省市兩級(jí)聯(lián)動(dòng)。任務(wù)需求:構(gòu)建信息錄入界面,完成人員基本信息的錄入工作。其中籍貫中涉及的“省、市/縣”能實(shí)現(xiàn)聯(lián)動(dòng),即:選擇“省”時(shí),“市”會(huì)根據(jù)選擇的“省”做相應(yīng)的變換。任務(wù)設(shè)計(jì):省市/縣的信息存放在CityMap類中,InputFrame類為界
21、面類,TestInputFrame為測(cè)試類。其類圖如圖2-5-1所示。2.6 課后小結(jié)到這里,對(duì)于Java集合框架的總結(jié)就結(jié)束了,還有很多集合類沒(méi)有在這里提到,更多的還是需要大家自己去查去用。通過(guò)閱讀源碼,查閱資料,收獲很大。Java集合框架主要包括Collection和Map兩種類型。其中Collection又有3種子類型,分別是List、Set、Queue。Map中存儲(chǔ)的主要是鍵值對(duì)映射。規(guī)則集Set中存儲(chǔ)的是不重復(fù)的元素,線性表中存儲(chǔ)可以包括重復(fù)的元素,Queue隊(duì)列描述的是先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),可以用LinkedList來(lái)實(shí)現(xiàn)隊(duì)列。效率上,規(guī)則集比線性表更高效。ArrayList主要是用
22、數(shù)組來(lái)存儲(chǔ)元素,LinkedList主要是用鏈表來(lái)存儲(chǔ)元素,HashMap的底層實(shí)現(xiàn)主要是借助數(shù)組+鏈表+紅黑樹(shù)來(lái)實(shí)現(xiàn)。Vector、HashTable等集合類效率比較低但都是線程安全的。包java.util.concurrent下包含了大量線程安全的集合類,效率上有較大提升。2.7 課后習(xí)題三、簡(jiǎn)答題1. Java集合框架是什么?說(shuō)出一些集合框架的優(yōu)點(diǎn)?2. Java集合框架的基礎(chǔ)接口有哪些?3. Iterator是什么?3. 遍歷一個(gè)List有哪些不同的方式?4. 如何決定選用HashMap還是TreeMap?5. ArrayList和LinkedList有何區(qū)別?6. ArrayList
23、和Vector有何異同點(diǎn)?Java高級(jí)程序設(shè)計(jì)第3章 Java反射機(jī)制3.1 應(yīng)用場(chǎng)景3.2 相關(guān)知識(shí)3.3 實(shí)施過(guò)程3.4 拓展知識(shí)3.5 拓展訓(xùn)練3.6 課后小結(jié)3.7 課后習(xí)題3.8 上機(jī)實(shí)訓(xùn)3.1 應(yīng)用場(chǎng)景在一些開(kāi)源框架里,如Spring,Struts,Hibernate,MyBatis等,應(yīng)用程序會(huì)提供一個(gè)配置文件如xml文件或者properties,然后在Java類里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串,然后用反射機(jī)制,根據(jù)這個(gè)字符串獲得某個(gè)類的Class實(shí)例,這樣就可以動(dòng)態(tài)配置一些東西,不用每一次都要在代碼里面去new或者做其他的事情,以后要改的話直接改配
24、置文件,代碼維護(hù)起來(lái)就很方便了,同時(shí)有時(shí)候要適應(yīng)某些需求,Java類里面不一定能直接調(diào)用另外的方法,這時(shí)候也可以通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)。應(yīng)用程序通過(guò)讀取配置文件來(lái)獲取到指定名稱的類的字節(jié)碼文件并加載其中的內(nèi)容進(jìn)行調(diào)用,對(duì)一個(gè)類文件進(jìn)行解剖,就可以取得任意一個(gè)已知名稱的class的內(nèi)部信息,包括其modifiers(諸如public,static等等)、superclass(例如Object)、實(shí)現(xiàn)之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于運(yùn)行時(shí)改變fields內(nèi)容或調(diào)用methods。3.2 相關(guān)知識(shí)3.2.1 Java反射機(jī)制的概
25、念3.2.2 反射機(jī)制的功能3.2.3 Java反射機(jī)制的相關(guān)API3.2.4 使用反射機(jī)制的步驟3.2.5 反射機(jī)制的應(yīng)用場(chǎng)景3.2.6 反射機(jī)制的優(yōu)缺點(diǎn)3.2.1 Java反射機(jī)制的概念Java反射機(jī)制在Java運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,我們都能夠知道這個(gè)類的所有屬性和方法;,對(duì)于任意一個(gè)對(duì)象,我們都能夠調(diào)用它的任意一個(gè)方法;。這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為Java語(yǔ)言的反射機(jī)制。3.2.2 反射機(jī)制的功能反射機(jī)制的功能如下:在運(yùn)行時(shí)判定任意一個(gè)對(duì)象所屬的類;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;在運(yùn)行時(shí)判定任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法;生
26、成動(dòng)態(tài)代理;。3.2.3 Java反射機(jī)制的相關(guān)APIjava.lang.reflect包提供了用于獲取類和對(duì)象的反射信息的類和接口。反射API允許對(duì)程序訪問(wèn)有關(guān)加載類的字段,方法和構(gòu)造函數(shù)的信息進(jìn)行編程訪問(wèn)。它允許在安全限制內(nèi)使用反射的字段,方法和構(gòu)造函數(shù)對(duì)其底層對(duì)等進(jìn)行操作。java.lang.Class; /類 java.lang.reflect.Constructor;/構(gòu)造方法 java.lang.reflect.Field; /類的成員變量 java.lang.reflect.Method;/類的方法java.lang.reflect.Modifier;/訪問(wèn)權(quán)限3.2.4 使用反
27、射機(jī)制的步驟導(dǎo)入Jjava.lang.relfect包需遵循以下3三個(gè)步驟:第一步是獲得你想操作的類的java.lang.Class對(duì)象;第二步是調(diào)用諸如getDeclaredMethods的方法;第三步使用反射API來(lái)操作這些信息。3.2.5 反射機(jī)制的應(yīng)用場(chǎng)景Java反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法,常見(jiàn)的應(yīng)用如下逆向代碼 ,例如反編譯與注解相結(jié)合的框架 例如Retrofit單純的反射機(jī)制應(yīng)用框架 例如EventBus 2.x動(dòng)態(tài)生成類框架 例如Gson3.2.6 反射機(jī)制的優(yōu)缺點(diǎn)可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編
28、譯,體現(xiàn)出很大的靈活性(特別是在J2EE的開(kāi)發(fā)中它的靈活性就表現(xiàn)的十分明顯)。通過(guò)反射機(jī)制我們可以獲得類的各種內(nèi)容,進(jìn)行了反編譯。對(duì)于JAVA這種先編譯再運(yùn)行的語(yǔ)言來(lái)說(shuō),反射機(jī)制可以使代碼更加靈活,更加容易實(shí)現(xiàn)面向?qū)ο?總結(jié)如下。優(yōu)點(diǎn):運(yùn)行期類型的判斷,動(dòng)態(tài)類加載,動(dòng)態(tài)代理使用反射。缺點(diǎn):性能是一個(gè)問(wèn)題,反射相當(dāng)于一系列解釋操作,通知jvm要做的事情,性能比直接的Java代碼要慢很多。3.3 實(shí)施過(guò)程任務(wù)需求:設(shè)有一個(gè)類Person,使用反射機(jī)制獲取該類的相關(guān)信息。任務(wù)設(shè)計(jì):實(shí)體類Person,存放個(gè)人的基本信息,測(cè)試類TestPerson使用反射機(jī)制獲取Person類或其對(duì)象的封裝信息。其類
29、圖如圖3-3-11所示。任務(wù)需求:設(shè)有一個(gè)類Person,使用反射機(jī)制獲取該類的相關(guān)信息。任務(wù)設(shè)計(jì):實(shí)體類Person,存放個(gè)人的基本信息,測(cè)試類TestPerson使用反射機(jī)制獲取Person類或其對(duì)象的封裝信息。其類圖如圖3-3-11所示。3.4 拓展知識(shí)Java的反射機(jī)制是Java特性之一,反射機(jī)制是構(gòu)建框架技術(shù)的基礎(chǔ)所在。在設(shè)計(jì)模式學(xué)習(xí)當(dāng)中,學(xué)習(xí)抽象工廠的時(shí)候就用到了反射來(lái)更加方便的讀取數(shù)據(jù)庫(kù)鏈接字符串等。Java中的配置文件為.properties,稱作屬性文件。通過(guò)反射讀取里邊的內(nèi)容。這樣代碼是固定的,但是配置文件的內(nèi)容我們可以改,這樣使我們的代碼靈活了很多!典型的除了Hibern
30、ate之外,還有Spring也用到很多反射機(jī)制。靈活掌握J(rèn)ava反射機(jī)制,對(duì)大家以后學(xué)習(xí)框架技術(shù)有很大的幫助3.5 拓展訓(xùn)練任務(wù)1 Java反射機(jī)制在工廠模式中的應(yīng)用先看簡(jiǎn)單工廠模式(simple factory)。任務(wù)設(shè)計(jì):接口Car,類Benz,Bmw,Bike。更好的理解工廠設(shè)計(jì)模式具體其類圖如圖3-5-3所示。3.6 課后小結(jié)1. 反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取自身的信息。在Jjava中,只要給定類的名字,那么就可以通過(guò)反射機(jī)制來(lái)獲得類的所有信息。2. 現(xiàn)在很多開(kāi)框架都用到反射機(jī)制,hibernate、struts都是用反射機(jī)制實(shí)現(xiàn)的。3. 靜態(tài)編譯:在編譯時(shí)確定類型,綁定對(duì)象,即
31、通過(guò)。 動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型,綁定對(duì)象。動(dòng)態(tài)編譯最大限度發(fā)揮了Jjava的靈活性,體現(xiàn)了多態(tài)的應(yīng)用,有以降低類之間的藕合性。一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯,體現(xiàn)出很大的靈活性,特別是在J2EE的開(kāi)發(fā)中它的靈活性就表現(xiàn)的十分明顯。4. 類中有什么信息,反射就可以獲得什么信息,不過(guò)前提是得知道類的名字。5. 有了Jjava反射機(jī)制,只需要寫一個(gè)dao類,四個(gè)方法,增刪改查,傳入不同的對(duì)象,無(wú)需為每一個(gè)表都創(chuàng)建dao類,反射機(jī)制會(huì)自動(dòng)幫我們完成剩下的事情,反射機(jī)制就是專門幫我們做那些重復(fù)的有規(guī)則的事情。3.7 課后習(xí)題三、簡(jiǎn)答題1.描述反射機(jī)制的作用。舉幾個(gè)反射的應(yīng)用。2.
32、簡(jiǎn)述Java反射中API的主要類及作用。3.簡(jiǎn)述Java反射的步驟。3.8 上機(jī)實(shí)訓(xùn)實(shí)訓(xùn)從配置文件中讀取類,并顯示其構(gòu)造函數(shù)。配置文件pertiesJava高級(jí)程序設(shè)計(jì)第4章 Java泛型4.1 應(yīng)用場(chǎng)景4.2 相關(guān)知識(shí)4.3 實(shí)施過(guò)程4.4 拓展知識(shí)4.5 拓展訓(xùn)練4.6 課后小結(jié)4.7 課后習(xí)題4.8 上機(jī)實(shí)訓(xùn)4.1 應(yīng)用場(chǎng)景假定我們有這樣一個(gè)需求:寫一個(gè)排序方法,能夠?qū)φ蛿?shù)組、字符串?dāng)?shù)組甚至其他任何類型的數(shù)組進(jìn)行排序,該如何實(shí)現(xiàn)?答案是可以使用 Java 泛型。使用 Java 泛型的概念,我們可以寫一個(gè)泛型方法來(lái)對(duì)一個(gè)對(duì)象數(shù)組排序。然后,調(diào)用該泛型方法來(lái)對(duì)整型數(shù)組、浮點(diǎn)數(shù)數(shù)組、字符串?dāng)?shù)
33、組等進(jìn)行排序。在使用框架SSH(Struts+Spring+Hibernate)開(kāi)發(fā)一個(gè)應(yīng)用系統(tǒng)中,常使用DAO(Date Access Object)來(lái)訪問(wèn)數(shù)據(jù)庫(kù)對(duì)象,完成數(shù)據(jù)庫(kù)中的數(shù)據(jù)和Java對(duì)象里的一種關(guān)聯(lián)關(guān)系的一系列操作CRUD。數(shù)據(jù)庫(kù)中的對(duì)象有很多,每一個(gè)對(duì)象都寫一個(gè)DAO,顯得很繁瑣,每一個(gè)DAO都要寫CRUD操作,這樣代碼的重復(fù)率高,如果使用泛型,代碼的復(fù)用得到了很好的應(yīng)用,提高了代碼的效率。4.2 相關(guān)知識(shí)4.2.1 泛型概念4.2.2 泛型的定義4.2.3 相關(guān)概念4.2.4 泛型的好處4.2.5 泛型使用時(shí)的注意事項(xiàng)4.2.1 泛型概念所謂“泛型”,就是“寬泛的數(shù)據(jù)類型”
34、,任意的數(shù)據(jù)類型。泛型是Java中一個(gè)非常重要的知識(shí)點(diǎn),在Java集合類框架中泛型被廣泛應(yīng)用。使用泛型可以很好的解決“代碼復(fù)用”問(wèn)題。4.2.2 泛型的定義1.定義泛型類在定義帶類型參數(shù)的類時(shí),在緊跟類命之后的內(nèi),指定一個(gè)或多個(gè)類型參數(shù)的名字,同時(shí)也可以對(duì)類型參數(shù)的取值范圍進(jìn)行限定,多個(gè)類型參數(shù)之間用,號(hào)分隔。定義完類型參數(shù)后,可以在定義位置之后的類的幾乎任意地方(靜態(tài)塊,靜態(tài)屬性,靜態(tài)方法除外)使用類型參數(shù), 就像使用普通的類型一樣。 注意,父類定義的類型參數(shù)不能被子類繼承。2.泛型方法在定義帶類型參數(shù)的方法時(shí),在緊跟可見(jiàn)范圍修飾(例如public)之后的內(nèi),指定一個(gè)或多個(gè)類型參數(shù)的名字,
35、同時(shí)也可以對(duì)類型參數(shù)的取值范圍進(jìn)行限定,多個(gè)類型參數(shù)之間用,號(hào)分隔。定義完類型參數(shù)后,可以在定義位置之后的方法的任意地方使用類型參數(shù),就像使用普通的類型一樣。 例如:4.2.3 相關(guān)概念1.通配符類型通配符一般是使用?代替具體的類型參數(shù),對(duì)類型參數(shù)賦予不確定值。例如 List 在邏輯上是List,List 等所有List的父類。2.上下邊界如果想限制使用泛型類別時(shí),只能用某個(gè)特定類型或者是其子類型才能實(shí)例化該類型時(shí),可以在定義類型時(shí),使用extends關(guān)鍵字指定這個(gè)類型必須是繼承某個(gè)類,或者實(shí)現(xiàn)某個(gè)接口,也可以是這個(gè)類或接口本身。(1)類型通配符上限通過(guò)形如List來(lái)定義,如此定義就是通配符泛
36、型值接受Number及其下層子類類型。(2)類型通配符下限通過(guò)形如 List來(lái)定義,表示類型只能接受Number及其三層父類類型,如Objec類型的實(shí)例。3.擦除在使用泛型時(shí)沒(méi)有指明數(shù)據(jù)類型,為了不出現(xiàn)錯(cuò)誤,編譯器會(huì)將所有數(shù)據(jù)向上轉(zhuǎn)型為 Object,即擦除泛型類型。在Java中,泛型是通過(guò)類型擦除來(lái)實(shí)現(xiàn)的,它是Java編譯器的概念,Java虛擬機(jī)運(yùn)行時(shí)對(duì)泛型基本一無(wú)所知,理解這一點(diǎn)是很重要的,它有助于我們理解Java泛型的很多局限性。4.2.4 泛型的好處(1)類型安全。通過(guò)知道使用泛型定義的變量的類型限制,編譯器可以更有效地提高Java程序的類型安全。(2)消除強(qiáng)制類型轉(zhuǎn)換。消除源代碼中的
37、許多強(qiáng)制類型轉(zhuǎn)換。這使得代碼更加可讀,并且減少了出錯(cuò)機(jī)會(huì)。所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的。(3)提高性能。4.2.5 泛型使用時(shí)的注意事項(xiàng)(1)泛型的類型參數(shù)只能是類類型(包括自定義類),不能是簡(jiǎn)單類型。(2)泛型的類型參數(shù)可以有多個(gè)。4.3 任務(wù)實(shí)施4.2.1 任務(wù)一 泛型類的定義和使用4.2.2 任務(wù)二 泛型方法的定義和使用4.2.3 任務(wù)三 泛型接口的定義和使用4.3.1 任務(wù)一 泛型類的定義和使用1.定義泛型類在定義帶類型參數(shù)的類時(shí),在緊跟類命之后的內(nèi),指定一個(gè)或多個(gè)類型參數(shù)的名字,同時(shí)也可以對(duì)類型參數(shù)的取值范圍進(jìn)行限定,多個(gè)類型參數(shù)之間用,號(hào)分隔。定義完類型參數(shù)后,可以在定義位置之后
38、的類的幾乎任意地方(靜態(tài)塊,靜態(tài)屬性,靜態(tài)方法除外)使用類型參數(shù), 就像使用普通的類型一樣。 注意,父類定義的類型參數(shù)不能被子類繼承。4.3.2 任務(wù)二 泛型方法的定義和使用 2.泛型方法在定義帶類型參數(shù)的方法時(shí),在緊跟可見(jiàn)范圍修飾(例如public)之后的內(nèi),指定一個(gè)或多個(gè)類型參數(shù)的名字, 同時(shí)也可以對(duì)類型參數(shù)的取值范圍進(jìn)行限定,多個(gè)類型參數(shù)之間用,號(hào)分隔。 4.3.3 任務(wù)三 泛型接口的定義和使用在定義帶類型參數(shù)的方法時(shí),在緊跟可見(jiàn)范圍修飾(例如public)之后的內(nèi),指定一個(gè)3.泛型接口先定義泛型接口:然后定義這個(gè)實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)這個(gè)接口:4.4 拓展知識(shí)在開(kāi)發(fā)高校圖書(shū)管理系統(tǒng)中,涉及多個(gè)數(shù)
39、據(jù)庫(kù)中的表,如:圖書(shū)基本信息表Book,教師信息表Teacher,學(xué)生信息表Student,用戶表User,出版社信息表Publishing,圖書(shū)分類信息表Category等。通過(guò)DAO(數(shù)據(jù)訪問(wèn)對(duì)象,Date Access Object)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行數(shù)據(jù)操作,就是數(shù)據(jù)庫(kù)中的數(shù)據(jù)和Java對(duì)象里的一種關(guān)聯(lián)關(guān)系的一系列操作,包括增刪改查(CRUD)操作。這些基本信息表對(duì)應(yīng)Java的實(shí)體類。每個(gè)實(shí)體類都包含CRUD操作。這樣使得代碼冗余度較高。那么能否將這多個(gè)DAO相同的方法封裝成一個(gè)呢?這是可以的,使用泛型類和泛型方法。抽象一個(gè)BaseDao,里面封裝了實(shí)體類相同的操作,當(dāng)需要操作表的
40、時(shí)候,將T換成User或者是Teacher就可以了。4.6 課后小結(jié)1. 泛型的本質(zhì)便是類型參數(shù)化,通俗的說(shuō)就是用一個(gè)變量來(lái)表示類型,這個(gè)類型可以是String,Integer等等不確定,表明可接受的類型。2. 泛型可以接受多個(gè)參數(shù),而Object經(jīng)過(guò)強(qiáng)制類型轉(zhuǎn)換可以轉(zhuǎn)換為任何類型,泛型可以把使用Object的錯(cuò)誤提前到編譯后,而不是運(yùn)行后,提升安全性。3. 在JAVA的虛擬機(jī)中并不存在泛型,泛型只是為了完善java體系,增加程序員編程的便捷性以及安全性而創(chuàng)建的一種機(jī)制,在JAVA虛擬機(jī)中對(duì)應(yīng)泛型的都是確定的類型,在編寫泛型代碼后,java虛擬中會(huì)把這些泛型參數(shù)類型都擦除,用相應(yīng)的確定類型來(lái)代
41、替,代替的這一動(dòng)作叫做類型擦除,而用于替代的類型稱為原始類型,在類型擦除過(guò)程中,一般使用第一個(gè)限定的類型來(lái)替換,若無(wú)限定則使用Object。4. 泛型限定是通過(guò)?(通配符)來(lái)實(shí)現(xiàn)的,表示可以接受任意類型。5. 泛型的一些基本規(guī)則約束*泛型的類型參數(shù)必須為類的引用,不能用基本類型(int, short, long, byte, float, double, char, boolean)。*泛型是類型的參數(shù)化,在使用時(shí)可以用作不同類型(此處在說(shuō)泛型類時(shí)會(huì)詳細(xì)說(shuō)明)。*泛型的類型參數(shù)可以有多個(gè)。4.7 課后習(xí)題三、簡(jiǎn)答題1. Java中的泛型是什么 ? 使用泛型的好處是什么?2. Java的泛型是如
42、何工作的 ? 什么是類型擦除?3. 什么是泛型中的限定通配符和非限定通配符 ?4. 如何編寫一個(gè)泛型方法,讓它能接受泛型參數(shù)并返回泛型類型?4.8 上機(jī)實(shí)訓(xùn)實(shí)訓(xùn)一、假如我們現(xiàn)在要定義一個(gè)類來(lái)表示坐標(biāo),要求坐標(biāo)的數(shù)據(jù)類型可以是整數(shù)、小數(shù)和字符串,例如:x = 10、y = 10 x = 12.88、y = 129.65x = 東京180度、y = 北緯210度定義泛型類Point,其中定義一個(gè)打印坐標(biāo)的泛型方法printPoint()。并定義一個(gè)測(cè)試類進(jìn)行測(cè)試,以不同的格式輸出給定的坐標(biāo)值。4.2.2 任務(wù)二 泛型方法的定義和使用4.2.2 任務(wù)二 泛型方法的定義和使用Java高級(jí)程序設(shè)計(jì)第5章
43、 Java序列化機(jī)制5.1 應(yīng)用場(chǎng)景5.2 相關(guān)知識(shí)5.3 實(shí)施過(guò)程5.4 拓展知識(shí)5.5 拓展訓(xùn)練5.6 課后小結(jié)5.7 課后習(xí)題5.8 上機(jī)實(shí)訓(xùn)5.1 應(yīng)用場(chǎng)景在分布式環(huán)境下,當(dāng)進(jìn)行遠(yuǎn)程通信時(shí),彼此可以發(fā)送各種類型的數(shù)據(jù)。無(wú)論是何種類型的數(shù)據(jù),都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳輸。發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,才能在網(wǎng)絡(luò)上傳送;接收方則需要把字節(jié)序列再恢復(fù)為Java對(duì)象。序列化是一種將對(duì)象以一連串的字節(jié)描述的過(guò)程,用于解決在對(duì)對(duì)象流進(jìn)行讀寫操作時(shí)所引發(fā)的問(wèn)題。序列化可以將對(duì)象的狀態(tài)寫在流里進(jìn)行網(wǎng)絡(luò)傳輸,或者保存到文件、數(shù)據(jù)庫(kù)等系統(tǒng)中,并在需要時(shí)把該流讀取出來(lái)重新構(gòu)造一個(gè)相同的對(duì)
44、象。5.2 相關(guān)知識(shí)5.2.1 序列化的概念5.2.2 序列化應(yīng)用5.2.3 序列化的幾種方式5.2.4 對(duì)象實(shí)現(xiàn)機(jī)制5.2.1 序列化的概念將在內(nèi)存中的各種對(duì)象的狀態(tài)(也就是實(shí)例變量,不是方法)保存在磁盤中或者在網(wǎng)絡(luò)中進(jìn)行傳輸,并且可以把保存的對(duì)象狀態(tài)再讀出來(lái)。將一個(gè)Java對(duì)象寫入IO流;與此對(duì)應(yīng)的,則是從IO流中恢復(fù)一個(gè)Java對(duì)象。Java提供這種保存對(duì)象狀態(tài)的機(jī)制,就是序列化。對(duì)象序列化是Java編程中的必備武器5.2.2 序列化應(yīng)用當(dāng)你想把內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫(kù)中時(shí)候;當(dāng)你想用套接字在網(wǎng)絡(luò)上傳送對(duì)象的時(shí)候;當(dāng)你想通過(guò)RMI傳輸對(duì)象的時(shí)候。5.2.3 序列化的幾種
45、方式在Java中socket傳輸數(shù)據(jù)時(shí),數(shù)據(jù)類型往往比較難選擇。可能要考慮帶寬、跨語(yǔ)言、版本的兼容等問(wèn)題。比較常見(jiàn)的做法有兩種:一是把對(duì)象包裝成JSON字符串傳輸,二是采用Java對(duì)象的序列化和反序列化。隨著Google工具protoBuf的開(kāi)源,protobuf也是個(gè)不錯(cuò)的選擇。*提示:對(duì)JSON,Object Serialize,ProtoBuf 做個(gè)對(duì)比。5.2.4 對(duì)象實(shí)現(xiàn)機(jī)制為了方便開(kāi)發(fā)人員將Java對(duì)象進(jìn)行序列化及反序列化,Java提供了一套方便的API來(lái)支持。其中包括以下接口和類:java.io.Serializablejava.io.ExternalizableObjectOu
46、tputObjectInputObjectOutputStreamObjectInputStream5.2 相關(guān)知識(shí)5.2.1 序列化的概念5.2.2 序列化應(yīng)用5.2.3 序列化的幾種方式5.2.4 對(duì)象實(shí)現(xiàn)機(jī)制5.3 實(shí)施過(guò)程5.3.1 任務(wù)一 使用serializable序列化實(shí)體對(duì)象5.3.2 任務(wù)二 反序列化將Person對(duì)象從磁盤上讀出5.3.1 任務(wù)一 使用serializable序列化實(shí)體對(duì)象實(shí)現(xiàn)Serializable接口非常簡(jiǎn)單,只要讓Jjava實(shí)現(xiàn)Serializable接口即可,無(wú)需實(shí)現(xiàn)任何方法。一個(gè)類一旦實(shí)現(xiàn)了Serializable接口,那么該類的對(duì)象就是可序列化的
47、。實(shí)現(xiàn)類的對(duì)象的序列化可以使用ObjectOutputStream,實(shí)現(xiàn)步驟如下:創(chuàng)建ObjectOutputStream對(duì)象;調(diào)用ObjectOutputStream的writeObject方法輸出對(duì)象。5.3.2 任務(wù)二 反序列化將Person對(duì)象從磁盤上讀出任務(wù)需求:反序列化將Employee對(duì)象從磁盤上讀出并修改員工信息,然后再寫入到文件中。分析:相應(yīng)的反序列化需要使用的類是ObjectInputStream,反序列化步驟如下:創(chuàng)建ObjectInputStream對(duì)象;使用ObjectInputStream的readObject方法取出對(duì)象。5.5 拓展訓(xùn)練常見(jiàn)Java序列化方式包括
48、Java原生以流的方法進(jìn)行的序列化、Json序列化、FastJson序列化、Protobuff序列化。這里主要講解JSON序列化。Json(JavaScript Object Notation ,JavaScript對(duì)象表示方法),它是一個(gè)輕量級(jí)的數(shù)據(jù)交換格式,我們可以很簡(jiǎn)單的來(lái)讀取和寫它,并且它很容易被計(jì)算機(jī)轉(zhuǎn)化和生成。Json的表現(xiàn)形式:Json的表現(xiàn)形式一般就三種(對(duì)象,數(shù)組,字符串),使用過(guò)程中,只是將對(duì)象與數(shù)組進(jìn)行混合了任務(wù): 利用jackson進(jìn)行json解析和序列化5.6 課后小結(jié)對(duì)序列化的理解通過(guò)序列化和反序列化實(shí)現(xiàn)了對(duì)象狀態(tài)的保存、傳輸以及對(duì)象的重建。在進(jìn)行對(duì)象序列化時(shí),開(kāi)發(fā)
49、人員可以根據(jù)自身情況,靈活選擇默認(rèn)方式或者自定義方式實(shí)現(xiàn)對(duì)象的序列化和反序列化。序列化機(jī)制是Java中對(duì)輕量級(jí)持久化的支持。序列化的字節(jié)流數(shù)據(jù)在網(wǎng)上傳輸?shù)陌踩珕?wèn)題需要引起大家足夠的注意。序列化破壞了原有類的數(shù)據(jù)的”安全性“,例如private屬性是不起作用的。序列化帶來(lái)的問(wèn)題網(wǎng)絡(luò)傳輸?shù)陌踩詫?duì)象進(jìn)行序列化之后轉(zhuǎn)化成有序的字節(jié)流在網(wǎng)絡(luò)上進(jìn)行傳輸,如果通過(guò)默認(rèn)的序列化方式, 則代碼都是以明文的方式進(jìn)行傳輸。這種情況下,部分字段的安全性是不能保障的,特別是像密碼這樣的安全敏感的信息。因此,如果您需要對(duì)部分字段信息進(jìn)行特 殊的處理,那么應(yīng)當(dāng)選擇定制對(duì)象的序列化方式,例如對(duì)密碼等敏感信息進(jìn)行加密處理。類
50、自身封裝的安全性對(duì)對(duì)象進(jìn)行序列化時(shí),類中所定義的被private、final等 訪問(wèn)控制符所修飾的字段是直接忽略這些訪問(wèn)控制符而直接進(jìn)行序列化的,因此,原本在本地定義的想要一次控制字段的訪問(wèn)權(quán)限的工作都是不起作用的。對(duì)于序列化后的有序字節(jié)流來(lái)說(shuō)一切都是可見(jiàn)的,而且是可重建的。這在一定程度上削弱了字段的安全性。因此,如果您需要特別處理這些信息,您可以選擇相應(yīng)的方式對(duì)這 些屬性進(jìn)行加密或者其他可行的處理,以盡量保持?jǐn)?shù)據(jù)的安全性。所以并非所有的對(duì)象都可以序列化。有很多原因,比如: 1.安全方面的原因,比如一個(gè)對(duì)象擁有private,public等f(wàn)ield,對(duì)于一個(gè)要傳輸?shù)膶?duì)象,比如寫到文件,或者進(jìn)
51、行rmi傳輸 等等,在序列化進(jìn)行傳輸?shù)倪^(guò)程中,這個(gè)對(duì)象的private等域是不受保護(hù)的。2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進(jìn)行傳輸或者保存,也無(wú)法對(duì)他們進(jìn)行重新的資源分配,而且,也是沒(méi)有必要這樣實(shí)現(xiàn)。序列化注意事項(xiàng)關(guān)于對(duì)象的序列化,總結(jié)下注意事項(xiàng):對(duì)象的類名、Field(包括基本類型、數(shù)組及對(duì)其他對(duì)象的引用)都會(huì)被序列化,對(duì)象的static Field,transient Field及方法不會(huì)被序列化;實(shí)現(xiàn)Serializable接口的類,如不想某個(gè)Field被序列化,可以使用transient關(guān)鍵字進(jìn)行修飾;保證序列化對(duì)象的引用類型Filed的類也是
52、可序列化的,如不可序列化,可以使用transient關(guān)鍵字進(jìn)行修飾,否則會(huì)序列化失??;反序列化時(shí)必須要有序列化對(duì)象的類的class文件;當(dāng)通過(guò)文件網(wǎng)絡(luò)讀取序列化對(duì)象的時(shí)候,必需按寫入的順序來(lái)讀取5.7 課后習(xí)題三、簡(jiǎn)答題1. 什么是Java序列化,如何實(shí)現(xiàn)Java序列化?2. 在什么情況下需要序列化?3.Java中實(shí)現(xiàn)序列化有哪幾種方法?5.8 上機(jī)實(shí)訓(xùn)實(shí)訓(xùn)一、序列化的使用1.編寫一個(gè)可以序列號(hào)的個(gè)人賬戶類AccountRecordSerializable具有如下的成員變量:privateintaccount;privateStringfirstName;privateStringlastNa
53、me;privatedoublebalance;具有如下的成員方法:AccountRecordSerializable(intacct,Stringfirst,Stringlast,doublebal)/初始化intgetAccount()doublegetBalance()StringgetFirstName()StringgetLastName()voidsetAccount(intacct)voidsetBalance(doublebal)voidsetFirstName(Stringfirst)voidsetLastName(Stringlast)2.編寫一個(gè)類CreateSequen
54、tialFile將上述的AccountRecordSerializable對(duì)象寫入到順序文件中。成員方法voidopenFile()/使用Fileoutputstream和Objectoutputstream創(chuàng)建和打開(kāi)磁盤文件clients.servoidaddRecords()/用戶通過(guò)鍵盤依次輸入accountfirstnamelasnamebalance構(gòu)建AccountRecordSerializable類對(duì)象,然后序列化到文件中。可以輸入多行信息。用戶按下ctrl+Z結(jié)束輸入。voidcloseFile()/關(guān)閉磁盤文件對(duì)象3.編寫測(cè)試類TestCreateSequentialFil
55、emain方法中創(chuàng)建CreateSequentialFile類對(duì)象,然后調(diào)用openFile()addRecords()closeFile()方法。Java高級(jí)程序設(shè)計(jì)第6章 Java多線程6.1 應(yīng)用場(chǎng)景6.2 相關(guān)知識(shí)6.3 實(shí)施過(guò)程6.4 拓展知識(shí)6.5 拓展訓(xùn)練6.6 課后小結(jié)6.7 課后習(xí)題6.8 上機(jī)實(shí)訓(xùn)6.1 應(yīng)用場(chǎng)景計(jì)算機(jī)可以同時(shí)完成多項(xiàng)任務(wù),稱為并發(fā)。并發(fā)完成的每個(gè)任務(wù)就是一個(gè)獨(dú)立線程。在網(wǎng)絡(luò)分布式、高并發(fā)應(yīng)用程序的情況下,Java多線程編程技術(shù)在很多開(kāi)發(fā)工作中得到非常廣泛的應(yīng)用。經(jīng)典的多線程問(wèn)題:1.火車票預(yù)訂問(wèn)題。假定火車票有10000張,現(xiàn)有10個(gè)售票點(diǎn)。每個(gè)售票窗口就
56、像一個(gè)線程,它們各自運(yùn)行,共同訪問(wèn)相同的數(shù)據(jù)火車票的數(shù)量。由于多個(gè)線程并發(fā)地執(zhí)行,訪問(wèn)共享同一數(shù)據(jù),會(huì)出現(xiàn)數(shù)據(jù)不一致的現(xiàn)象,所有必須要用同步鎖synchronized,保證某一時(shí)刻只能有一個(gè)線程執(zhí)行售票功能。2.經(jīng)典生產(chǎn)者與消費(fèi)者問(wèn)題。生產(chǎn)者不斷的往倉(cāng)庫(kù)中存放產(chǎn)品,消費(fèi)者從倉(cāng)庫(kù)中消費(fèi)產(chǎn)品。其中生產(chǎn)者和消費(fèi)者都可以有若干個(gè)。在這里,生產(chǎn)者是一個(gè)線程,消費(fèi)者是一個(gè)線程。倉(cāng)庫(kù)容量有限,只有庫(kù)滿時(shí)生產(chǎn)者不能存放,庫(kù)空時(shí)消費(fèi)者不能取產(chǎn)品,這就是線程的同步。3.客戶機(jī)/服務(wù)器通信問(wèn)題。假如Server只能接受一個(gè)Client請(qǐng)求,當(dāng)?shù)谝粋€(gè)Client連接后就占據(jù)了這個(gè)位置,后續(xù)Client不能再繼續(xù)連接。
57、采用多線程機(jī)制,當(dāng)Server每接受到一個(gè)Client連接請(qǐng)求之后,都把處理流程放到一個(gè)獨(dú)立的線程里去運(yùn)行,然后等待下一個(gè)Client連接請(qǐng)求,這樣就不會(huì)阻塞Server端接收請(qǐng)求了。6.2 相關(guān)知識(shí)6.2.1 相關(guān)概念6.2.2 線程的創(chuàng)建和啟動(dòng)6.2.3 線程的生命周期6.2.4 線程的管理6.2.1 相關(guān)概念進(jìn)程是指運(yùn)行中的應(yīng)用程序,每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間。一個(gè)應(yīng)用程序可以同時(shí)啟動(dòng)多個(gè)線程。幾乎所有的操作系統(tǒng)都支持同時(shí)運(yùn)行多個(gè)任務(wù),一個(gè)任務(wù)通常就是一個(gè)程序,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)程序運(yùn)行時(shí),內(nèi)部可能包含了多個(gè)順序執(zhí)行流,每個(gè)順序執(zhí)行流就是一個(gè)線程。一個(gè)進(jìn)程可以由多個(gè)
58、線程組成,即在一個(gè)進(jìn)程中可以同時(shí)運(yùn)行多少不同的線程,他們分別執(zhí)行不同的任務(wù)。當(dāng)進(jìn)程內(nèi)的多個(gè)線程同時(shí)運(yùn)行時(shí),這種運(yùn)行方式被稱為并發(fā)運(yùn)行。進(jìn)程(Process):是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。在早期面向進(jìn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是程序的基本執(zhí)行實(shí)體;在當(dāng)代面向線程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進(jìn)程是程序的實(shí)體。進(jìn)程的特征特征動(dòng)態(tài)性:進(jìn)程的實(shí)質(zhì)是程序在多道程序系統(tǒng)中的一次執(zhí)行過(guò)程,進(jìn)程是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的。并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行獨(dú)立性:進(jìn)程是一個(gè)能獨(dú)立運(yùn)行
59、的基本單位,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)結(jié)構(gòu)特征:進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成。多個(gè)不同的進(jìn)程可以包含相同的程序:一個(gè)程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進(jìn)程,能得到不同的結(jié)果;但是執(zhí)行過(guò)程中,程序不能發(fā)生改變。線程(Thread):有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,
60、只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。就緒狀態(tài)是指線程具備運(yùn)行的所有條件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線程占有處理機(jī)正在運(yùn)行;阻塞狀態(tài)是指線程在等待一個(gè)事件(如某個(gè)信號(hào)量),邏輯上不可執(zhí)行。每一個(gè)程序都至少有一個(gè)線程,若程序只有一個(gè)線程,那就是程序本身。線程是程序中一個(gè)單一的順序控制流程。進(jìn)程內(nèi)一個(gè)相對(duì)獨(dú)立的、可調(diào)度的執(zhí)行單元,是系統(tǒng)獨(dú)立調(diào)度和分派CPU的基本單位指
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JB/T 20208-2024大蜜丸涼丸機(jī)
- 統(tǒng)編版二年級(jí)語(yǔ)文下冊(cè)期末達(dá)標(biāo)測(cè)試卷(模擬沖刺)(含答案)
- 湖南省岳陽(yáng)市臨湘市2024-2025學(xué)年高三下學(xué)期入學(xué)考試物理試題(含答案)
- 2025年軍隊(duì)文職人員招聘之軍隊(duì)文職政治學(xué)能力提升試卷A卷附答案
- 2023年遼寧省中考地理試卷(含答案)
- 2021-2022學(xué)年廣東省廣州四中教育集團(tuán)七年級(jí)(下)期中數(shù)學(xué)試卷(含答案)
- 護(hù)師房顫考試題及答案
- 2025年法律知識(shí)競(jìng)賽判斷題庫(kù)及答案
- 智能能源管理平臺(tái)開(kāi)發(fā)合作協(xié)議
- 工業(yè)制造業(yè)技術(shù)創(chuàng)新成果展示表
- 2024年資格考試-良好農(nóng)業(yè)規(guī)范認(rèn)證檢查員考試近5年真題集錦(頻考類試題)帶答案
- 2024年普通高等學(xué)校招生全國(guó)統(tǒng)一考試·新課標(biāo)卷(生物)附試卷分析
- 優(yōu)化熱處理工藝的機(jī)器學(xué)習(xí)
- 2024年1月時(shí)政熱點(diǎn)題庫(kù)及答案
- 2023年山東省夏季普通高中學(xué)業(yè)水平合格考試會(huì)考生物試題及參考答案
- 非正常接發(fā)列車作業(yè)標(biāo)準(zhǔn)
- 體育室內(nèi)課-體育大富翁
- 2024年國(guó)家保安員資格考試題庫(kù)及參考答案(完整版)
- DL-T692-2018電力行業(yè)緊急救護(hù)技術(shù)規(guī)范
- 消防員訓(xùn)練傷的預(yù)防及恢復(fù)課件
- 醫(yī)院感染防控基本知識(shí)2
評(píng)論
0/150
提交評(píng)論