Java程序設(shè)計教程課件_第1頁
Java程序設(shè)計教程課件_第2頁
Java程序設(shè)計教程課件_第3頁
Java程序設(shè)計教程課件_第4頁
Java程序設(shè)計教程課件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

人民郵電出版社10集合、反射和注解Java程序設(shè)計第章C目錄ONTENTS10.2反射10.3注解10.4小結(jié)10.1集合10.1.1集合類框架結(jié)構(gòu)Java提供的集合不是一個類,而是一系列的接口、抽象類和具體的實現(xiàn)類。主要有兩個系列,一個是Collection系列,一個是Map系列。Collection系列的用于存儲和處理集合元素是單個數(shù)據(jù)的情況。而Map系列的用于存儲和處理元素是鍵值對的集合。Collection系列的又分為兩類,一類是可重復、注重順序的List子系,一類是不可重復相對不注重順序的set子系。10.1.1集合類框架結(jié)構(gòu)10.1.1集合類框架結(jié)構(gòu)實線邊框的是實現(xiàn)類,如ArrayList,LinkedList,HashMap等短劃線邊框的是抽象類,如AbstractCollection,AbstractList,AbstractMap等點線邊框的是接口,如Collection,List,Map等。Java中的集合類主要從Collection和Map兩個接口派生。10.1.2List接口List接口的定義形式:publicinterfaceList<E>extendsCollection<E>List是有序集合,可以準確地控制元素在集合中的插入位置,可以通過索引獲得集合中的元素,可以通過元素獲得元素在集合中的位置。它的主要方法如表10.1所示。10.1.2List接口表10.1List接口中的主要方法類型方法名方法功能booleanadd(Ee)把元素e加到表的尾部voidadd(int

index,E

e)把元素e加到表的index位置,原index位置元素順序后移booleanequals(Object

o)比較對象o是否與表中的元素是同一元素Eget(int

index)得到表中index位置的元素booleanindexOf(Objecto)判斷元素o在表中是否存在。如果不存在,則返回-1Iterator<E>iterator()獲得表的遍歷器Eremove(int

index)將表中第index位置的元素刪除booleanremove(Object

o)刪除表中與o相同的元素intsize()得到表中元素的個數(shù)ArrayList類的定義形式:publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,Serializable10.1.3ArrayList類【例10.1】ArrayList類的使用。Example10_01.java10.1.4LinkedList類LinkedList類的定義形式:publicclassLinkedList<E>extendsAbstractSequentialList<E>implementsList<E>,Deque<E>,Cloneable,Serializable10.1.4LinkedList類【例10.2】LinkedList類的使用。Example10_2.java10.1.5Set接口Set接口的定義形式為:publicinterfaceSet<E>extendsCollection<E>Set接口也是Collection的一種擴展,與List不同的是,在Set中的對象元素不能重復,也就是說不能把同樣的東西兩次放入同一個Set容器中。它的常用具體實現(xiàn)有HashSet和TreeSet類。10.1.5Set接口10.1.6HashSet類HashSet類的定義形式:publicclassHashSet<E>extendsAbstractSet<E>implementsSet<E>,Cloneable,Serializable【例10.3】HashSet的使用。Example10_03.javaHashSet類按照哈希算法來存取對象。當向集合中加入一個新對象時,會調(diào)用對象的hashCode()方法得到對象的哈希碼,然后根據(jù)這個碼計算出對象在集合中存儲的位置。HashSet對象中不能存儲相同的數(shù)據(jù),存儲數(shù)據(jù)是無序的。10.1.7Map接口Map是一種把鍵對象和值對象進行關(guān)聯(lián)的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對于鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結(jié)果的一致性。當然在使用過程中,某個鍵所對應(yīng)的值對象可能會發(fā)生變化,這時會按照最后一次修改的值對象與鍵對應(yīng)。對于值對象則沒有唯一性的要求。可以將任意多個鍵都映射到一個值對象上,這不會發(fā)生任何問題。Map接口的定義形式:publicinterfaceMap<K,V>10.1.7Map接口10.1.8HashMap類Map有兩種比較常用的實現(xiàn):HashMap和TreeMap。HashMap用的是哈希碼的算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它還有一些擴展的方法,比如firstKey(),lastKey()等,還可以從TreeMap中指定一個范圍以取得其子Map。HashMap是日常開發(fā)中,用的最多的集合類之一。HashMap類的定義形式:publicclassHashMap<K,V>extendsAbstractMap<K,V>implementsMap<K,V>,Cloneable,Serializable【例10.4】HashMap類的使用。Example10_04.java10.1.9集合的遍歷雖然對于不同類型的具體集合類可能會有特定的遍歷方式,但也提供了共性的方法,主要有普通for、增強型的for和iterator方式來遍歷集合?!纠?0.6】關(guān)于Map類型集合的遍歷。Example10_06.java【例10.5】List與Set類型集合的遍歷。Example10_05.java10.1.10聚合操作1.聚合操作簡介Stream是一個接口,可以將集合或數(shù)組中的元素轉(zhuǎn)換為Stream流的形式。在對流進行處理時,不同的流操作以級聯(lián)的方式形成處理流水線。一個流水線由一個源,以及0到多個中間操作和一個終結(jié)操作構(gòu)成。這個流水線也被稱為管道流。聚合操作是通過Stream流處理實現(xiàn)的。但要注意它和java.io包下的InputStream和OutputStream沒有什么關(guān)系。源:源是流中元素的來源。Java提供了很多內(nèi)置的源,包括數(shù)組、集合、生成函數(shù)、無限序列生成器和I/O通道等。中間操作:中間操作是在一個流上進行操作,返回結(jié)果也是一個流。這些操作是延遲執(zhí)行的。終結(jié)操作:終結(jié)操作通過遍歷流來產(chǎn)生一個結(jié)果或是某些作用。在一個流上執(zhí)行終結(jié)操作之后,該流被消費,無法再次被使用。10.1.10聚合操作2.流對象的創(chuàng)建(1)所有的Collections集合都可以使用stream()靜態(tài)方法獲取Stream流對象;需要說明的是,雖然Map接口中并沒有stream()方法,但是Map的values()和keySet()均返回集合對象,在集合對象上當然是可以使用stream()方法的。(2)Arrays數(shù)組工具類的stream()靜態(tài)方法也可以獲取數(shù)組元素的Stream流對象。(3)Stream接口的of()靜態(tài)方法可以獲取基本類型包裝類數(shù)組、引用類型數(shù)組和單個元素的Stream流對象;實際上of()方法內(nèi)部其實調(diào)用了Arrays.stream()方法實現(xiàn)的。(4)Stream.iterate創(chuàng)建流的方式(5)Stream.generate創(chuàng)建流的方式(6)使用流行的APIs,如Ppile().splitAsStream()10.1.10聚合操作上面前三種在創(chuàng)建流之前,對象的大?。ㄩL度)已經(jīng)確認,所以這種流也被成為有限流。而通過Stream.iterate和Stream.generate創(chuàng)建流的方式,是無限大小的流(generate最大是Long.MAX_VALUE),也被稱為無限流。2.流對象的創(chuàng)建【例10.7】流對象的幾種創(chuàng)建方式。Example10_07.java10.1.10聚合操作每個中間操作,又會返回一個Stream,比如.filter()又返回一個Stream,中間操作是“懶”操作,并不會真正進行遍歷。流中間操作在應(yīng)用到流上,返回一個新的流。常用的流中間操作如表10.8所示。3.中間操作10.1.10聚合操作3.中間操作10.1.10聚合操作終結(jié)操作可以遍歷流進而生成結(jié)果或直接消費,而后該流不能再被使用。幾乎在所有情況下,終結(jié)操作都是立即執(zhí)行的,在返回之前完成對數(shù)據(jù)源的遍歷和對管道的處理。終結(jié)操作才真正進行遍歷行為,前面的中間操作也在這個時候,才真正的執(zhí)行。4.終結(jié)操作10.1.10聚合操作

4.終結(jié)操作10.1.10聚合操作5.聚合操作案例【例10.8】流對象的幾種創(chuàng)建方式。Example10_08.javaC目錄ONTENTS10.2反射10.3注解10.4小結(jié)10.1集合10.2反射在程序運行過程中,對于任意一個對象,都能夠知道這個對象所在類的所有屬性和方法,都能夠調(diào)用它的任意一個方法和訪問它的任意一個屬性,這種動態(tài)調(diào)用對象的方法及動態(tài)獲取的信息的功能稱為Java語言的反射機制。與反射有關(guān)的類包括Class類、Constructor類、Field類和Method類,它們可以統(tǒng)稱反射類。反射可以實現(xiàn)程序的動態(tài)效果。通過反射,可以在程序運行過程中知道程序中使用了哪些類及類中的屬性和方法。注解用于在程序編譯、運行時解析和使用,起到說明配置作用。10.2反射Class類在包java.lang中。Class類的定義形式:1.Class類publicfinalclassClass<T>extendsObjectimplementsSerializable,GenericDeclaration,Type,AnnotatedElement類型方法方法功能static

Class<?>

forName(String

className)按給定的類名創(chuàng)建一個Class類的對象Constructor[]getConstructors()獲得一個類中的所有公有構(gòu)造方法Constructor[]getDeclaredConstructors()獲得一個類中的所有構(gòu)造方法Field[]getFields()獲得一個類中的所有公有域Field[]getDeclaredFields()獲得一個類的所有域Method[]getMethods()獲得一個類中所有的公有方法Method[]getDeclaredMethods()獲得一個類的所有方法TgetDeclaredMethods()創(chuàng)建一個Class所表示的類的對象10.2反射1.Class類10.2反射Constructor類在包java.lang.reflect中。Constructor類的定義形式如下:2.Constructor類publicfinalclassConstructor<T>extendsAccessibleObjectimplementsGenericDeclaration,Member類型方法方法功能ClassgetDeclaringClass()得到一個Class類的對象ClassgetDeclaringClass()獲得Method對象表示的構(gòu)造方法所在類的對象Class[]getParameterTypes()獲得Constructor對象表示的構(gòu)造方法中的參數(shù)的類型StringgetName()獲得Method對象所表示的構(gòu)造方法的名字TnewInstance()通過調(diào)用當前Constructor類對象所表示的類的構(gòu)造方法創(chuàng)建一個新對象10.2反射2.Constructor類10.2反射Field類在包java.lang.reflect中。Field類的定義形式如下:publicfinalclassFieldextendsAccessibleObject

implementsMember3.Field類類型方法方法功能Objectget(Object

obj)獲得obj對象中相應(yīng)域的值ClassgetDeclaringClass()得到一個Class類的對象StringgetName()獲得Field對象所表示的域的名字TgetAnnotation(Class

annotationClass)獲得annotation類中當前Field對象所表示的域的注解實例booleanisAnnotationPresent(ClassaannotationClass)判斷annotationClass類中當前Field對象所表示的域是否有注解voidset(Object

obj,Object

value)設(shè)置由Field對象對應(yīng)的obj對象中的域的值為value10.2反射3.Field類Method類在包java.lang.reflect包中。Method類的定義形式如下:publicfinalclassMethodextendsAccessibleObjectimplementsGenericDeclaration,Member10.2反射4.Method類類型方法方法功能ClassgetDeclaringClass()得到一個Class類的對象StringgetName()獲得Methos對象所表示的方法的名字Class[]getParameterTypes()獲得Method對象表示的方法中的參數(shù)的類型Objectinvoke(Object

obj,Object...

args)調(diào)用Method對象表示的方法,相當于對象obj用參數(shù)args調(diào)用該方法10.2反射4.Method類【例10.9】利用反射類獲取其他類的域和方法,并能實現(xiàn)對象的復制。Example10_09.javaC目錄ONTENTS10.2反射10.3注解10.4小結(jié)10.1集合10.3注解注解(Annotation)又可稱標注,它是程序的元數(shù)據(jù),也是程序代碼的標記。注解可以在編譯、加載類和運行時獲得,可以根據(jù)注解對數(shù)據(jù)進行相應(yīng)的處理。使用反射功能,可以對程序代碼進行分析;使用系統(tǒng)定義的注解,可以在編譯時對程序進行檢查;使用元注解,可以生成相應(yīng)的文檔。注解用在包、類、字段、方法、局部變量、方法參數(shù)等的前面,對這些元素進行說明和注釋。有系統(tǒng)定義的注解,也可以自定義,還有元注解,就是注解的注解。Java語言本身定義了五個基本的注解,有@Override、@Deprecated、@SupressWarnings、@SafeVarargs和@FunctionalIterface。(1)@Override對方法注解,它注解的方法必須是對父類方法的重寫,否則編譯時會給出編譯錯誤。(2)@Deprecated可以對域和方法注解,表示注解的域或方法過時了。10.3注解1.系統(tǒng)定義的注解@SupressWarnings(“unchecked”)@SupressWarnings({“unchecked”,”deprecation”})(3)@SupressWarnings對方法注解,如果編譯方法時有警告錯誤,則不顯示警告錯誤。@SupressWarnings使用時需要給出注解元素值,可以給單個值,也可以以數(shù)組形式給多個值。如:10.3注解1.系統(tǒng)定義的注解10.3注解1.系統(tǒng)定義的注解(4)@SafeVarargs@SafeVarargs是專門為抑制“堆污染”警告提供的?!纠?0.10】系統(tǒng)注解的使用。Example10_10.java10.3注解1.系統(tǒng)定義的注解(5)@FunctionalIterface@FunctionalInterface是用來指定某個接口必須是函數(shù)式接口,否則就會編譯出錯。[public|final]@interface注解名{//注解元素的定義數(shù)據(jù)類型注解元素名()[default缺省值];……}如果只有一個注解元素,注解元素名最好命名為“value”?!纠?0.11】自定義注解,并利用反射功能提取注解值。Example10_11.java10.3注解2.用戶自定義注解注解也可以再被注解,注解的注解稱為元注解,用于對注解的說明或控制。系統(tǒng)定義的元注解有5個,分別是@Retention、@Documented、@Target、@Inherited和@Repeatable。(1)@Override它所標記的注解的保存方式。使用時要給出參數(shù),參數(shù)有3個可選值,分別是SOURCE(注解只存在在源程序中,編譯器忽略注解)、CLASS(在編譯時保存注解,運行時忽略)和RUNTIME(運行時保留注解,并可以獲得注解)。(2)@Documented它所標注的注解可以被Javadoc提取出來成為程序的文檔。10.3注解3.元注解(3)@Target它所標注的注解可以用于標注哪些元素。可以標注的元素作為@Target的參數(shù),參數(shù)有8個可選值,分別是ANNOTATION_TYPE(可以對注解標注)、

溫馨提示

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

評論

0/150

提交評論