Java高級程序設計全書電子教案完整版課件_第1頁
Java高級程序設計全書電子教案完整版課件_第2頁
Java高級程序設計全書電子教案完整版課件_第3頁
Java高級程序設計全書電子教案完整版課件_第4頁
Java高級程序設計全書電子教案完整版課件_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java高級程序設計第1章 Java編碼規(guī)范1.1 應用場景1.2 相關知識1.3 任務實施1.4 拓展知識1.5 拓展訓練1.6課后小結1.1 應用場景 一個大型的軟件項目是由一個團隊來完成的,每個程序員在給包、類、 變量、方法取名的時候,如果根本沒有一點約定,只是隨心所欲,可能會帶來一系列問題。 編碼規(guī)范是程序編碼所要遵循的規(guī)則,保證代碼的正確性、穩(wěn)定性、可讀性。規(guī)范編碼有以下作用。一、規(guī)范的代碼可以促進團隊合作二、規(guī)范的代碼可以減少bug處理三、規(guī)范的代碼可以降低維護成本四、規(guī)范的代碼有助于代碼審查五、養(yǎng)成代碼規(guī)范的習慣,有助于程序員自身的成長1.2 相關知識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其中兩者最本質的區(qū)別在于,.Java文件是供虛擬機運行時執(zhí)行的文件,而.class文件可以讓你在任何一臺安裝了Java虛擬機的機器上運行。1.2.2 源文件樣式約定Java源文件必須按順序由以下3部分組成。1、版權信息。2、包和引入語句。3、類和接口聲明。1. 版權信息版權和版本信息必須在Java文件的開頭,其他不需要出現在javadoc的信息也可以包含在這里。2. 包和引入語句package 行要在i

3、mport行之前,import 中標準的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。3. 類和接口聲明每個Java源文件都包含一個單一的公共類或接口。1.2.3 注釋規(guī)范1.注釋編寫的原則(1)注釋形式統(tǒng)一。在整個應用程序中,使用具有一致的標點和結構的樣式來構造注釋。如果在其他項目中發(fā)現它們的注釋規(guī)范與這份文檔不同,按照這份規(guī)范寫代碼,不要試圖在既成的規(guī)范系統(tǒng)中引入新的規(guī)范。(2)注釋內容準確簡潔。內容要簡單、明了、含義準確,防止注釋的多義性,錯誤的注釋不但無益反而有害。2.注釋類型的基本劃分(1)基本注釋必須要添加

4、,包括以下幾種: 1、類(接口)的注釋; 2、構造函數的注釋; 3、方法的注釋; 4、全局變量的注釋; 5、字段/屬性的注釋;簡單的代碼做簡單注釋,注釋內容不大于10個字即可,另外,持久化對象或VO對象的getter、setter方法不需加注釋。(2)特殊必加的注釋包括以下幾種:1、典型算法必須有注釋。2、在代碼不明晰處必須有注釋。3、在代碼修改處加上修改標識的注釋。4、在循環(huán)和邏輯分支組成的代碼中加注釋。5、為他人提供的接口必須加詳細注釋。具體的注釋格式自行定義,要求注釋內容準確簡潔。3.注釋的格式(1)單行(single-line)注釋格式為“/”。(2)塊(block)注釋格式為“/*/

5、”。(3)文檔注釋格式為“/*/”。(4)Javadoc注釋標簽語法如下:author 對類的說明,標明開發(fā)該類模塊的作者;version 對類的說明,標明該類模塊的版本;see 對類、屬性、方法的說明,參考轉向,也就是相關主題;param 對方法的說明,對方法中某參數的說明;return 對方法的說明,對方法返回值的說明;exception 對方法的說明,對方法可能拋出的異常進行說明。1.2.4 命名規(guī)范命名指系統(tǒng)中對包名、目錄(類名)、方法、常量、變量等標識符的命名。標識符的命名力求做到統(tǒng)一、達意、簡潔,遵循駝峰法則。統(tǒng)一是指對于同一個概念,在程序中用同一種表示方法。例如對于供應商,既可以

6、用supplier,也可以用provider,但是我們只能選定一個使用,至少在一個Java項目中保持統(tǒng)一。達意是指標識符能準確地表達出它所代表的意義,如newSupplier, OrderPaymentGatewayService等;而 supplier1, service2,idtts等則不是好的命名方式。簡潔是指,在統(tǒng)一和達意的前提下,用盡量少的標識符。如果不能達意,寧愿不要太簡潔。例如,theOrderNameOfTheTargetSupplierWhichIsTransfered 太長,transferedTargetSupplierOrderName則較好,但是transTgtSpl

7、OrdNm就不好了。省略元音的縮寫方式不要使用,我們的英語往往還沒有好到看得懂奇怪的縮寫。用駝峰法則是指單詞之間不使用特殊符號分割,而是通過首字母大寫來分割。例如推薦用 SupplierName, addNewContract,而不是supplier_name, add_new_contract。1.3 任務實施1.3.1 任務一 計算員工的月工資(1)任務需求某公司分為多個部門,每個部門有一個經理和多個員工,每個員工根據職稱發(fā)基本工資。員工的工資按基本工資、日加班工資、日缺勤工資等組成。具體需求如下所示(1)員工的基本信息,部門、職務、職稱以及工資記錄等信息。(2)能記錄員工的每一個職稱信息

8、,并授予相應的職稱,系統(tǒng)在 計算員工工資的時候選取職稱對應的最高職稱津貼。(2)任務分析問題域中涉及多個類,職員類Staffer,經理類Manager,測試類TestEmployee。Staffer類:通過此類封裝定義計算員工基本工資方法Manager類:通過此類封裝定義計算員工基本工資方法TestEmployee類:調用方法并實現結果輸出1.4 拓展知識相對于之前所提到的一些基本的編程需要注意的慣例,其他慣例(Miscellaneous Practices)也是非常重要的,下面就列出相對應的慣例:1.每次保存的時候,都讓你的代碼是最美的2. 使用log而不是System.out.printl

9、n()3. 每個if while for等語句,都不要省略大括號4. 善用TODO5. 在需要留空的地方放一個空語句或注釋6. 不要再對boolean值做true false判斷7. 減少代碼嵌套層次1.5 拓展訓練 良好的編碼習慣可以大大提高可讀性以及編碼效率。請讀者從一開始就養(yǎng)成一個良好的編碼習慣。通過以下校驗郵件地址方法模板展示較為規(guī)范的編碼格式:1.6 課后小結1.規(guī)范需要平時編碼過程中注意,是一個慢慢養(yǎng)成的好習慣。2.命名規(guī)范。所有的標識符只能用英文字母,數字,下劃線,并采用駝峰標識。3.注釋規(guī)范。注釋有:單行注釋 “/”, 多行注釋 “/*.*/”, 文檔注釋 “/*/”。4.排版

10、規(guī)范。代碼應避免一行長度超過60個字符。5.聲明規(guī)范。一行聲明一個變量,只在代碼塊的開始處聲明變量。6.語句規(guī)范。一條語句占用一行。7.編程規(guī)范。用于設置的方法前綴必須是set;用于檢索一個布爾類型的方法前綴必須是is,而用于檢索其他方法前綴必須是get。程序中應盡可能少使用數字(或字符),盡可能定義靜態(tài)變量來說明該數字(或字符)的含義。1.7 課后習題 1. 相對獨立的程序塊之間、變量說明之后必須加_。2. 類注釋部分,描述部分說明該類或者接口的功能、作用、使用方法和注意事項,每次修改后增加作者、新版本號和當天的日期,since _,deprecated 表示_。3. 比較操作符,賦值操作符

11、=、+=,算術操作符+、%,邏輯操作符&、&,位域操作符、等雙目操作符的前后加_。4. Java中的注釋有三種形式: 文檔注釋 、 多行注釋 和_。5. 方法的文檔中,塊標記param用于說明_的含義,return用于說明_1.下列錯誤使用異常的做法是_。A.在程序中使用異常處理還是使用錯誤返回碼處理,根據是否有利于程序結構來確定,并且異常和錯誤碼不應該混合使用,推薦使用異常。B.一個方法不應拋出太多類型的異常。throws/exception子句標明的異常最好不要超過三個。C.異常捕獲盡量不要直接catch(Exceptionex),應該把異常細分處理。D.程序內拋出的異常本身就可說明異常的

12、類型、拋出條件,可不填寫詳細的描述信息。捕獲異常后用exception.toString()取到詳細信息后保存。2下列說法錯誤的是_。A.段代碼各語句之間有實質性關聯并且是完成同一件功能的,那么可考慮把此段代碼構造成一個新的方法。B.源程序中關系較為緊密的代碼應盡可能相鄰。C.程序中可同時使用錯誤碼和異常進行處理,推薦使用異常。D.方法參數建議不超過5個。1.8 上機實訓實訓一、計算幾何圖形的面積、周長。其類圖如1-1所示。Java高級程序設計第2章 Java集合框架2.1 應用場景2.6 課后小結2.2 相關知識 2.7 課后習題2.3 實施過程2.8 上機實訓2.4 拓展知識2.5 拓展訓

13、練2.1 應用場景在Java編程時,常常需要集中存放多個數據。當然我們可以使用數組來保存多個對象。但數組長度不可變化;而且數組無法保存具有映射關系的數據。為了保存數量不確定的數據,以及保存具有映射關系的數據(也被稱為關聯數組),就要使用Java提供的集合類。JDK提供了大量優(yōu)秀的集合實現供開發(fā)者使用,合格的程序員必須要能夠通過功能場景和性能需求選用最合適的集合,這就要求開發(fā)者必須熟悉Java的常用集合框架類。2.2 相關知識2.2.1 集合框架2.2.2 Java集合框架2.3.3 Java集合框架的使用2.2.1 集合框架在現實生活中,集合被理解為:很多事物湊在一起;在。數學中,的集合:為具

14、有共同屬性的事物的總體。通常情況下,我們把具有相同性質的一類東西,匯聚成一個整體,就可以稱為集合。通常集合有兩種表示法,一種是列舉法,比如集合A=1,2,3,4,另一種是性質描述法,比如集合B=X|0X100且X屬于整數。集合論的奠基人康托爾在創(chuàng)建集合理論給出了許多公理和性質,這都成為后來集合在其他領域應用的基礎。2.2.2 Java集合框架在Java語言中,Java語言的設計者對常用的數據結構和算法做了一些規(guī)范(接口)和實現(具體實現接口的類)。所有抽象出來的數據結構和操作(算法)統(tǒng)稱為Java集合框架(JavaCollectionFramework),。如圖2-1所示。2.2.3 Java

15、集合框架的使用Java程序員在具體應用時,不必考慮數據結構和算法的實現細節(jié),只需要用這些類創(chuàng)建出來一些對象,然后直接應用就可以了,這樣就大大提高了編程效率。2.3 實施過程2.3.1 List的使用2.3.2 Set的使用2.3.3 Map的使用2.3.1 LIST的使用1.List接口List繼承自Collection接口。List是一種有序集合,List中的元素可以根據索引(順序號:元素在集合中處于的位置信息)進行取得/刪除/插入操作。跟Set集合不同的是,List允許有重復元素。對于滿足e1.equals(e2)條件的e1與e2對象元素,可以同時存在于List集合中。2.List實現類L

16、ist接口的實現類主要有ArrayList,LinkedList,Vector,Stack等。2.3.2 SET的使用1.Set接口Set 是繼承于Collection的接口。java中的set接口有如下的特點:不允許出現重復元素;集合中的元素位置無順序;有且只有一個值為null的元素。2.Set接口的實現類實現了Set接口的主要有HashSet、TreeSet、LinkedHashSet。HashSet依賴于HashMap,它實際上是通過HashMap實現的。HashSet中的元素是無序的。TreeSet依賴于TreeMap,它實際上是通過TreeMap實現的。TreeSet中的元素是有序的

17、。2.3.3 MAP的使用1.Map接口Map提供了一種映射關系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠實現根據key快速查找value;。Map中的鍵值對以Entry類型的對象實例形式存在;。鍵建(key值)不可重復,value值可以重復,一個value值可以和很多key值形成對應關系,每個鍵最多只能映射到一個值。Map支持泛型,形式如:Map。Map中使用put(K key,V value)方法添加。2.已知實現類在java.util包中接口 Map 存儲鍵值對,作為一個元組存入。元組以鍵作為標記,鍵相同時,值覆蓋。類型參數:K - 此映射所維護的鍵的類型;V - 映

18、射值的類型;其已知實現類:為HashMap、TreeMap。2.4 拓展知識1.Vector前面我們已經提到,Java設計者們在對之前的容器類進行重新設計時保留了一些數據結構,其中就有Vector。用法上,Vector與ArrayList基本一致,不同之處在于Vector使用了關鍵字synchronized,將訪問和修改向量的方法都變成同步的了,所以對于不需要同步的應用程序來說,類ArrayList比類Vector更高效。2.StackStack,棧類,是Java2之前引入的,繼承自類Vector。3.HashTableHashTable和前面介紹的HashMap很類似,它也是一個散列表,存儲

19、的內容是鍵值對映射,不同之處在于,HashTable是繼承自Dictionary的,HashTable中的函數都是同步的,這意味著它也是線程安全的,另外,HashTable中key和value都不可以為null。上面的三個集合類都是在Java2之前推出的容器類,可以看到,盡管在使用中效率比較低,但是它們都是線程安全的。下面介紹兩個特殊的集合類。4.ConcurrentHashMapConcurrent,并發(fā),從名字就可以看出來ConcurrentHashMap是HashMap的線程安全版。同HashMap相比,ConcurrentHashMap不僅保證了訪問的線程安全性,而且在效率上與Hash

20、Table相比,也有較大的提高。關于ConcurrentHashMap的設計,我將會在下一篇關于并發(fā)編程的博客中介紹,敬請關注。5.CopyOnWriteArrayListCopyOnWriteArrayList,是一個線程安全的List接口的實現,它使用了ReentrantLock鎖來保證在并發(fā)情況下提供高性能的并發(fā)讀取。2.5 拓展訓練任務要求:實現省市兩級聯動。任務需求:構建信息錄入界面,完成人員基本信息的錄入工作。其中籍貫中涉及的“省、市/縣”能實現聯動,即:選擇“省”時,“市”會根據選擇的“省”做相應的變換。任務設計:省市/縣的信息存放在CityMap類中,InputFrame類為界

21、面類,TestInputFrame為測試類。其類圖如圖2-5-1所示。2.6 課后小結到這里,對于Java集合框架的總結就結束了,還有很多集合類沒有在這里提到,更多的還是需要大家自己去查去用。通過閱讀源碼,查閱資料,收獲很大。Java集合框架主要包括Collection和Map兩種類型。其中Collection又有3種子類型,分別是List、Set、Queue。Map中存儲的主要是鍵值對映射。規(guī)則集Set中存儲的是不重復的元素,線性表中存儲可以包括重復的元素,Queue隊列描述的是先進先出的數據結構,可以用LinkedList來實現隊列。效率上,規(guī)則集比線性表更高效。ArrayList主要是用

22、數組來存儲元素,LinkedList主要是用鏈表來存儲元素,HashMap的底層實現主要是借助數組+鏈表+紅黑樹來實現。Vector、HashTable等集合類效率比較低但都是線程安全的。包java.util.concurrent下包含了大量線程安全的集合類,效率上有較大提升。2.7 課后習題三、簡答題1. Java集合框架是什么?說出一些集合框架的優(yōu)點?2. Java集合框架的基礎接口有哪些?3. Iterator是什么?3. 遍歷一個List有哪些不同的方式?4. 如何決定選用HashMap還是TreeMap?5. ArrayList和LinkedList有何區(qū)別?6. ArrayList

23、和Vector有何異同點?Java高級程序設計第3章 Java反射機制3.1 應用場景3.2 相關知識3.3 實施過程3.4 拓展知識3.5 拓展訓練3.6 課后小結3.7 課后習題3.8 上機實訓3.1 應用場景在一些開源框架里,如Spring,Struts,Hibernate,MyBatis等,應用程序會提供一個配置文件如xml文件或者properties,然后在Java類里面解析xml或properties里面的內容,得到一個字符串,然后用反射機制,根據這個字符串獲得某個類的Class實例,這樣就可以動態(tài)配置一些東西,不用每一次都要在代碼里面去new或者做其他的事情,以后要改的話直接改配

24、置文件,代碼維護起來就很方便了,同時有時候要適應某些需求,Java類里面不一定能直接調用另外的方法,這時候也可以通過反射機制來實現。應用程序通過讀取配置文件來獲取到指定名稱的類的字節(jié)碼文件并加載其中的內容進行調用,對一個類文件進行解剖,就可以取得任意一個已知名稱的class的內部信息,包括其modifiers(諸如public,static等等)、superclass(例如Object)、實現之interfaces(例如Serializable),也包括fields和methods的所有信息,并可于運行時改變fields內容或調用methods。3.2 相關知識3.2.1 Java反射機制的概

25、念3.2.2 反射機制的功能3.2.3 Java反射機制的相關API3.2.4 使用反射機制的步驟3.2.5 反射機制的應用場景3.2.6 反射機制的優(yōu)缺點3.2.1 Java反射機制的概念Java反射機制在Java運行狀態(tài)中,對于任意一個類,我們都能夠知道這個類的所有屬性和方法;,對于任意一個對象,我們都能夠調用它的任意一個方法;。這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為Java語言的反射機制。3.2.2 反射機制的功能反射機制的功能如下:在運行時判定任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判定任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生

26、成動態(tài)代理;。3.2.3 Java反射機制的相關APIjava.lang.reflect包提供了用于獲取類和對象的反射信息的類和接口。反射API允許對程序訪問有關加載類的字段,方法和構造函數的信息進行編程訪問。它允許在安全限制內使用反射的字段,方法和構造函數對其底層對等進行操作。java.lang.Class; /類 java.lang.reflect.Constructor;/構造方法 java.lang.reflect.Field; /類的成員變量 java.lang.reflect.Method;/類的方法java.lang.reflect.Modifier;/訪問權限3.2.4 使用反

27、射機制的步驟導入Jjava.lang.relfect包需遵循以下3三個步驟:第一步是獲得你想操作的類的java.lang.Class對象;第二步是調用諸如getDeclaredMethods的方法;第三步使用反射API來操作這些信息。3.2.5 反射機制的應用場景Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法,常見的應用如下逆向代碼 ,例如反編譯與注解相結合的框架 例如Retrofit單純的反射機制應用框架 例如EventBus 2.x動態(tài)生成類框架 例如Gson3.2.6 反射機制的優(yōu)缺點可以實現動態(tài)創(chuàng)建對象和編

28、譯,體現出很大的靈活性(特別是在J2EE的開發(fā)中它的靈活性就表現的十分明顯)。通過反射機制我們可以獲得類的各種內容,進行了反編譯。對于JAVA這種先編譯再運行的語言來說,反射機制可以使代碼更加靈活,更加容易實現面向對象,總結如下。優(yōu)點:運行期類型的判斷,動態(tài)類加載,動態(tài)代理使用反射。缺點:性能是一個問題,反射相當于一系列解釋操作,通知jvm要做的事情,性能比直接的Java代碼要慢很多。3.3 實施過程任務需求:設有一個類Person,使用反射機制獲取該類的相關信息。任務設計:實體類Person,存放個人的基本信息,測試類TestPerson使用反射機制獲取Person類或其對象的封裝信息。其類

29、圖如圖3-3-11所示。任務需求:設有一個類Person,使用反射機制獲取該類的相關信息。任務設計:實體類Person,存放個人的基本信息,測試類TestPerson使用反射機制獲取Person類或其對象的封裝信息。其類圖如圖3-3-11所示。3.4 拓展知識Java的反射機制是Java特性之一,反射機制是構建框架技術的基礎所在。在設計模式學習當中,學習抽象工廠的時候就用到了反射來更加方便的讀取數據庫鏈接字符串等。Java中的配置文件為.properties,稱作屬性文件。通過反射讀取里邊的內容。這樣代碼是固定的,但是配置文件的內容我們可以改,這樣使我們的代碼靈活了很多!典型的除了Hibern

30、ate之外,還有Spring也用到很多反射機制。靈活掌握Java反射機制,對大家以后學習框架技術有很大的幫助3.5 拓展訓練任務1 Java反射機制在工廠模式中的應用先看簡單工廠模式(simple factory)。任務設計:接口Car,類Benz,Bmw,Bike。更好的理解工廠設計模式具體其類圖如圖3-5-3所示。3.6 課后小結1. 反射機制指的是程序在運行時能夠獲取自身的信息。在Jjava中,只要給定類的名字,那么就可以通過反射機制來獲得類的所有信息。2. 現在很多開框架都用到反射機制,hibernate、struts都是用反射機制實現的。3. 靜態(tài)編譯:在編譯時確定類型,綁定對象,即

31、通過。 動態(tài)編譯:運行時確定類型,綁定對象。動態(tài)編譯最大限度發(fā)揮了Jjava的靈活性,體現了多態(tài)的應用,有以降低類之間的藕合性。一句話,反射機制的優(yōu)點就是可以實現動態(tài)創(chuàng)建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發(fā)中它的靈活性就表現的十分明顯。4. 類中有什么信息,反射就可以獲得什么信息,不過前提是得知道類的名字。5. 有了Jjava反射機制,只需要寫一個dao類,四個方法,增刪改查,傳入不同的對象,無需為每一個表都創(chuàng)建dao類,反射機制會自動幫我們完成剩下的事情,反射機制就是專門幫我們做那些重復的有規(guī)則的事情。3.7 課后習題三、簡答題1.描述反射機制的作用。舉幾個反射的應用。2.

32、簡述Java反射中API的主要類及作用。3.簡述Java反射的步驟。3.8 上機實訓實訓從配置文件中讀取類,并顯示其構造函數。配置文件pertiesJava高級程序設計第4章 Java泛型4.1 應用場景4.2 相關知識4.3 實施過程4.4 拓展知識4.5 拓展訓練4.6 課后小結4.7 課后習題4.8 上機實訓4.1 應用場景假定我們有這樣一個需求:寫一個排序方法,能夠對整型數組、字符串數組甚至其他任何類型的數組進行排序,該如何實現?答案是可以使用 Java 泛型。使用 Java 泛型的概念,我們可以寫一個泛型方法來對一個對象數組排序。然后,調用該泛型方法來對整型數組、浮點數數組、字符串數

33、組等進行排序。在使用框架SSH(Struts+Spring+Hibernate)開發(fā)一個應用系統(tǒng)中,常使用DAO(Date Access Object)來訪問數據庫對象,完成數據庫中的數據和Java對象里的一種關聯關系的一系列操作CRUD。數據庫中的對象有很多,每一個對象都寫一個DAO,顯得很繁瑣,每一個DAO都要寫CRUD操作,這樣代碼的重復率高,如果使用泛型,代碼的復用得到了很好的應用,提高了代碼的效率。4.2 相關知識4.2.1 泛型概念4.2.2 泛型的定義4.2.3 相關概念4.2.4 泛型的好處4.2.5 泛型使用時的注意事項4.2.1 泛型概念所謂“泛型”,就是“寬泛的數據類型”

34、,任意的數據類型。泛型是Java中一個非常重要的知識點,在Java集合類框架中泛型被廣泛應用。使用泛型可以很好的解決“代碼復用”問題。4.2.2 泛型的定義1.定義泛型類在定義帶類型參數的類時,在緊跟類命之后的內,指定一個或多個類型參數的名字,同時也可以對類型參數的取值范圍進行限定,多個類型參數之間用,號分隔。定義完類型參數后,可以在定義位置之后的類的幾乎任意地方(靜態(tài)塊,靜態(tài)屬性,靜態(tài)方法除外)使用類型參數, 就像使用普通的類型一樣。 注意,父類定義的類型參數不能被子類繼承。2.泛型方法在定義帶類型參數的方法時,在緊跟可見范圍修飾(例如public)之后的內,指定一個或多個類型參數的名字,

35、同時也可以對類型參數的取值范圍進行限定,多個類型參數之間用,號分隔。定義完類型參數后,可以在定義位置之后的方法的任意地方使用類型參數,就像使用普通的類型一樣。 例如:4.2.3 相關概念1.通配符類型通配符一般是使用?代替具體的類型參數,對類型參數賦予不確定值。例如 List 在邏輯上是List,List 等所有List的父類。2.上下邊界如果想限制使用泛型類別時,只能用某個特定類型或者是其子類型才能實例化該類型時,可以在定義類型時,使用extends關鍵字指定這個類型必須是繼承某個類,或者實現某個接口,也可以是這個類或接口本身。(1)類型通配符上限通過形如List來定義,如此定義就是通配符泛

36、型值接受Number及其下層子類類型。(2)類型通配符下限通過形如 List來定義,表示類型只能接受Number及其三層父類類型,如Objec類型的實例。3.擦除在使用泛型時沒有指明數據類型,為了不出現錯誤,編譯器會將所有數據向上轉型為 Object,即擦除泛型類型。在Java中,泛型是通過類型擦除來實現的,它是Java編譯器的概念,Java虛擬機運行時對泛型基本一無所知,理解這一點是很重要的,它有助于我們理解Java泛型的很多局限性。4.2.4 泛型的好處(1)類型安全。通過知道使用泛型定義的變量的類型限制,編譯器可以更有效地提高Java程序的類型安全。(2)消除強制類型轉換。消除源代碼中的

37、許多強制類型轉換。這使得代碼更加可讀,并且減少了出錯機會。所有的強制轉換都是自動和隱式的。(3)提高性能。4.2.5 泛型使用時的注意事項(1)泛型的類型參數只能是類類型(包括自定義類),不能是簡單類型。(2)泛型的類型參數可以有多個。4.3 任務實施4.2.1 任務一 泛型類的定義和使用4.2.2 任務二 泛型方法的定義和使用4.2.3 任務三 泛型接口的定義和使用4.3.1 任務一 泛型類的定義和使用1.定義泛型類在定義帶類型參數的類時,在緊跟類命之后的內,指定一個或多個類型參數的名字,同時也可以對類型參數的取值范圍進行限定,多個類型參數之間用,號分隔。定義完類型參數后,可以在定義位置之后

38、的類的幾乎任意地方(靜態(tài)塊,靜態(tài)屬性,靜態(tài)方法除外)使用類型參數, 就像使用普通的類型一樣。 注意,父類定義的類型參數不能被子類繼承。4.3.2 任務二 泛型方法的定義和使用 2.泛型方法在定義帶類型參數的方法時,在緊跟可見范圍修飾(例如public)之后的內,指定一個或多個類型參數的名字, 同時也可以對類型參數的取值范圍進行限定,多個類型參數之間用,號分隔。 4.3.3 任務三 泛型接口的定義和使用在定義帶類型參數的方法時,在緊跟可見范圍修飾(例如public)之后的內,指定一個3.泛型接口先定義泛型接口:然后定義這個實現類來實現這個接口:4.4 拓展知識在開發(fā)高校圖書管理系統(tǒng)中,涉及多個數

39、據庫中的表,如:圖書基本信息表Book,教師信息表Teacher,學生信息表Student,用戶表User,出版社信息表Publishing,圖書分類信息表Category等。通過DAO(數據訪問對象,Date Access Object)實現對數據庫中的表進行數據操作,就是數據庫中的數據和Java對象里的一種關聯關系的一系列操作,包括增刪改查(CRUD)操作。這些基本信息表對應Java的實體類。每個實體類都包含CRUD操作。這樣使得代碼冗余度較高。那么能否將這多個DAO相同的方法封裝成一個呢?這是可以的,使用泛型類和泛型方法。抽象一個BaseDao,里面封裝了實體類相同的操作,當需要操作表的

40、時候,將T換成User或者是Teacher就可以了。4.6 課后小結1. 泛型的本質便是類型參數化,通俗的說就是用一個變量來表示類型,這個類型可以是String,Integer等等不確定,表明可接受的類型。2. 泛型可以接受多個參數,而Object經過強制類型轉換可以轉換為任何類型,泛型可以把使用Object的錯誤提前到編譯后,而不是運行后,提升安全性。3. 在JAVA的虛擬機中并不存在泛型,泛型只是為了完善java體系,增加程序員編程的便捷性以及安全性而創(chuàng)建的一種機制,在JAVA虛擬機中對應泛型的都是確定的類型,在編寫泛型代碼后,java虛擬中會把這些泛型參數類型都擦除,用相應的確定類型來代

41、替,代替的這一動作叫做類型擦除,而用于替代的類型稱為原始類型,在類型擦除過程中,一般使用第一個限定的類型來替換,若無限定則使用Object。4. 泛型限定是通過?(通配符)來實現的,表示可以接受任意類型。5. 泛型的一些基本規(guī)則約束*泛型的類型參數必須為類的引用,不能用基本類型(int, short, long, byte, float, double, char, boolean)。*泛型是類型的參數化,在使用時可以用作不同類型(此處在說泛型類時會詳細說明)。*泛型的類型參數可以有多個。4.7 課后習題三、簡答題1. Java中的泛型是什么 ? 使用泛型的好處是什么?2. Java的泛型是如

42、何工作的 ? 什么是類型擦除?3. 什么是泛型中的限定通配符和非限定通配符 ?4. 如何編寫一個泛型方法,讓它能接受泛型參數并返回泛型類型?4.8 上機實訓實訓一、假如我們現在要定義一個類來表示坐標,要求坐標的數據類型可以是整數、小數和字符串,例如:x = 10、y = 10 x = 12.88、y = 129.65x = 東京180度、y = 北緯210度定義泛型類Point,其中定義一個打印坐標的泛型方法printPoint()。并定義一個測試類進行測試,以不同的格式輸出給定的坐標值。4.2.2 任務二 泛型方法的定義和使用4.2.2 任務二 泛型方法的定義和使用Java高級程序設計第5章

43、 Java序列化機制5.1 應用場景5.2 相關知識5.3 實施過程5.4 拓展知識5.5 拓展訓練5.6 課后小結5.7 課后習題5.8 上機實訓5.1 應用場景在分布式環(huán)境下,當進行遠程通信時,彼此可以發(fā)送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳輸。發(fā)送方需要把這個Java對象轉換為字節(jié)序列,才能在網絡上傳送;接收方則需要把字節(jié)序列再恢復為Java對象。序列化是一種將對象以一連串的字節(jié)描述的過程,用于解決在對對象流進行讀寫操作時所引發(fā)的問題。序列化可以將對象的狀態(tài)寫在流里進行網絡傳輸,或者保存到文件、數據庫等系統(tǒng)中,并在需要時把該流讀取出來重新構造一個相同的對

44、象。5.2 相關知識5.2.1 序列化的概念5.2.2 序列化應用5.2.3 序列化的幾種方式5.2.4 對象實現機制5.2.1 序列化的概念將在內存中的各種對象的狀態(tài)(也就是實例變量,不是方法)保存在磁盤中或者在網絡中進行傳輸,并且可以把保存的對象狀態(tài)再讀出來。將一個Java對象寫入IO流;與此對應的,則是從IO流中恢復一個Java對象。Java提供這種保存對象狀態(tài)的機制,就是序列化。對象序列化是Java編程中的必備武器5.2.2 序列化應用當你想把內存中的對象狀態(tài)保存到一個文件中或者數據庫中時候;當你想用套接字在網絡上傳送對象的時候;當你想通過RMI傳輸對象的時候。5.2.3 序列化的幾種

45、方式在Java中socket傳輸數據時,數據類型往往比較難選擇??赡芤紤]帶寬、跨語言、版本的兼容等問題。比較常見的做法有兩種:一是把對象包裝成JSON字符串傳輸,二是采用Java對象的序列化和反序列化。隨著Google工具protoBuf的開源,protobuf也是個不錯的選擇。*提示:對JSON,Object Serialize,ProtoBuf 做個對比。5.2.4 對象實現機制為了方便開發(fā)人員將Java對象進行序列化及反序列化,Java提供了一套方便的API來支持。其中包括以下接口和類:java.io.Serializablejava.io.ExternalizableObjectOu

46、tputObjectInputObjectOutputStreamObjectInputStream5.2 相關知識5.2.1 序列化的概念5.2.2 序列化應用5.2.3 序列化的幾種方式5.2.4 對象實現機制5.3 實施過程5.3.1 任務一 使用serializable序列化實體對象5.3.2 任務二 反序列化將Person對象從磁盤上讀出5.3.1 任務一 使用serializable序列化實體對象實現Serializable接口非常簡單,只要讓Jjava實現Serializable接口即可,無需實現任何方法。一個類一旦實現了Serializable接口,那么該類的對象就是可序列化的

47、。實現類的對象的序列化可以使用ObjectOutputStream,實現步驟如下:創(chuàng)建ObjectOutputStream對象;調用ObjectOutputStream的writeObject方法輸出對象。5.3.2 任務二 反序列化將Person對象從磁盤上讀出任務需求:反序列化將Employee對象從磁盤上讀出并修改員工信息,然后再寫入到文件中。分析:相應的反序列化需要使用的類是ObjectInputStream,反序列化步驟如下:創(chuàng)建ObjectInputStream對象;使用ObjectInputStream的readObject方法取出對象。5.5 拓展訓練常見Java序列化方式包括

48、Java原生以流的方法進行的序列化、Json序列化、FastJson序列化、Protobuff序列化。這里主要講解JSON序列化。Json(JavaScript Object Notation ,JavaScript對象表示方法),它是一個輕量級的數據交換格式,我們可以很簡單的來讀取和寫它,并且它很容易被計算機轉化和生成。Json的表現形式:Json的表現形式一般就三種(對象,數組,字符串),使用過程中,只是將對象與數組進行混合了任務: 利用jackson進行json解析和序列化5.6 課后小結對序列化的理解通過序列化和反序列化實現了對象狀態(tài)的保存、傳輸以及對象的重建。在進行對象序列化時,開發(fā)

49、人員可以根據自身情況,靈活選擇默認方式或者自定義方式實現對象的序列化和反序列化。序列化機制是Java中對輕量級持久化的支持。序列化的字節(jié)流數據在網上傳輸的安全問題需要引起大家足夠的注意。序列化破壞了原有類的數據的”安全性“,例如private屬性是不起作用的。序列化帶來的問題網絡傳輸的安全性對象進行序列化之后轉化成有序的字節(jié)流在網絡上進行傳輸,如果通過默認的序列化方式, 則代碼都是以明文的方式進行傳輸。這種情況下,部分字段的安全性是不能保障的,特別是像密碼這樣的安全敏感的信息。因此,如果您需要對部分字段信息進行特 殊的處理,那么應當選擇定制對象的序列化方式,例如對密碼等敏感信息進行加密處理。類

50、自身封裝的安全性對對象進行序列化時,類中所定義的被private、final等 訪問控制符所修飾的字段是直接忽略這些訪問控制符而直接進行序列化的,因此,原本在本地定義的想要一次控制字段的訪問權限的工作都是不起作用的。對于序列化后的有序字節(jié)流來說一切都是可見的,而且是可重建的。這在一定程度上削弱了字段的安全性。因此,如果您需要特別處理這些信息,您可以選擇相應的方式對這 些屬性進行加密或者其他可行的處理,以盡量保持數據的安全性。所以并非所有的對象都可以序列化。有很多原因,比如: 1.安全方面的原因,比如一個對象擁有private,public等field,對于一個要傳輸的對象,比如寫到文件,或者進

51、行rmi傳輸 等等,在序列化進行傳輸的過程中,這個對象的private等域是不受保護的。2. 資源分配方面的原因,比如socket,thread類,如果可以序列化,進行傳輸或者保存,也無法對他們進行重新的資源分配,而且,也是沒有必要這樣實現。序列化注意事項關于對象的序列化,總結下注意事項:對象的類名、Field(包括基本類型、數組及對其他對象的引用)都會被序列化,對象的static Field,transient Field及方法不會被序列化;實現Serializable接口的類,如不想某個Field被序列化,可以使用transient關鍵字進行修飾;保證序列化對象的引用類型Filed的類也是

52、可序列化的,如不可序列化,可以使用transient關鍵字進行修飾,否則會序列化失??;反序列化時必須要有序列化對象的類的class文件;當通過文件網絡讀取序列化對象的時候,必需按寫入的順序來讀取5.7 課后習題三、簡答題1. 什么是Java序列化,如何實現Java序列化?2. 在什么情況下需要序列化?3.Java中實現序列化有哪幾種方法?5.8 上機實訓實訓一、序列化的使用1.編寫一個可以序列號的個人賬戶類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.編寫一個類CreateSequen

54、tialFile將上述的AccountRecordSerializable對象寫入到順序文件中。成員方法voidopenFile()/使用Fileoutputstream和Objectoutputstream創(chuàng)建和打開磁盤文件clients.servoidaddRecords()/用戶通過鍵盤依次輸入accountfirstnamelasnamebalance構建AccountRecordSerializable類對象,然后序列化到文件中??梢暂斎攵嘈行畔?。用戶按下ctrl+Z結束輸入。voidcloseFile()/關閉磁盤文件對象3.編寫測試類TestCreateSequentialFil

55、emain方法中創(chuàng)建CreateSequentialFile類對象,然后調用openFile()addRecords()closeFile()方法。Java高級程序設計第6章 Java多線程6.1 應用場景6.2 相關知識6.3 實施過程6.4 拓展知識6.5 拓展訓練6.6 課后小結6.7 課后習題6.8 上機實訓6.1 應用場景計算機可以同時完成多項任務,稱為并發(fā)。并發(fā)完成的每個任務就是一個獨立線程。在網絡分布式、高并發(fā)應用程序的情況下,Java多線程編程技術在很多開發(fā)工作中得到非常廣泛的應用。經典的多線程問題:1.火車票預訂問題。假定火車票有10000張,現有10個售票點。每個售票窗口就

56、像一個線程,它們各自運行,共同訪問相同的數據火車票的數量。由于多個線程并發(fā)地執(zhí)行,訪問共享同一數據,會出現數據不一致的現象,所有必須要用同步鎖synchronized,保證某一時刻只能有一個線程執(zhí)行售票功能。2.經典生產者與消費者問題。生產者不斷的往倉庫中存放產品,消費者從倉庫中消費產品。其中生產者和消費者都可以有若干個。在這里,生產者是一個線程,消費者是一個線程。倉庫容量有限,只有庫滿時生產者不能存放,庫空時消費者不能取產品,這就是線程的同步。3.客戶機/服務器通信問題。假如Server只能接受一個Client請求,當第一個Client連接后就占據了這個位置,后續(xù)Client不能再繼續(xù)連接。

57、采用多線程機制,當Server每接受到一個Client連接請求之后,都把處理流程放到一個獨立的線程里去運行,然后等待下一個Client連接請求,這樣就不會阻塞Server端接收請求了。6.2 相關知識6.2.1 相關概念6.2.2 線程的創(chuàng)建和啟動6.2.3 線程的生命周期6.2.4 線程的管理6.2.1 相關概念進程是指運行中的應用程序,每個進程都有自己獨立的內存空間。一個應用程序可以同時啟動多個線程。幾乎所有的操作系統(tǒng)都支持同時運行多個任務,一個任務通常就是一個程序,每個運行中的程序就是一個進程。當一個程序運行時,內部可能包含了多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程。一個進程可以由多個

58、線程組成,即在一個進程中可以同時運行多少不同的線程,他們分別執(zhí)行不同的任務。當進程內的多個線程同時運行時,這種運行方式被稱為并發(fā)運行。進程(Process):是計算機中的程序關于某數據集合上的一次運行活動,是系統(tǒng)進行資源分配和調度的基本單位,是操作系統(tǒng)結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執(zhí)行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。進程的特征特征動態(tài)性:進程的實質是程序在多道程序系統(tǒng)中的一次執(zhí)行過程,進程是動態(tài)產生,動態(tài)消亡的。并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行獨立性:進程是一個能獨立運行

59、的基本單位,同時也是系統(tǒng)分配資源和調度的獨立單位;異步性:由于進程間的相互制約,使進程具有執(zhí)行的間斷性,即進程按各自獨立的、不可預知的速度向前推進結構特征:進程由程序、數據和進程控制塊三部分組成。多個不同的進程可以包含相同的程序:一個程序在不同的數據集里就構成不同的進程,能得到不同的結果;但是執(zhí)行過程中,程序不能發(fā)生改變。線程(Thread):有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調度和分派的基本單位,線程自己不擁有系統(tǒng)資源,

60、只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其他線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。就緒狀態(tài)是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態(tài)是指線程占有處理機正在運行;阻塞狀態(tài)是指線程在等待一個事件(如某個信號量),邏輯上不可執(zhí)行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執(zhí)行單元,是系統(tǒng)獨立調度和分派CPU的基本單位指

溫馨提示

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

評論

0/150

提交評論