版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
JAVA高級特性1第六章
泛型和注解2回憶Class對象提供了大量訪問類的內(nèi)部結(jié)構(gòu)的方法。如何訪問這些信息?java.lang.reflect包還提供了用于動態(tài)代理的類和接口分別是什么?如何使用CGLIB實現(xiàn)動態(tài)代理模式?3本章內(nèi)容Annotation的概念和作用根本注解、元注解和自定義注解提取注解信息定義泛型接口、泛型類、泛型方法類型通配符和通配符限定擦除4理解java注解的概念和作用掌握注解的使用掌握提取注解信息掌握泛型的使用掌握通配符的使用本章目標5根本注解@Override:指定方法重寫,強制一個子類必須重寫父類的方法。只能作用于方法,不能作用于其他元素。@Deprecated:用于標記某個程序元素已過時,當其他程序使用已過時的類、方法時,編譯器將會給出警告@SuppressWarnings:抑制編譯器警告。6根本注解強制子類重寫父類方法,如果沒有重寫會出現(xiàn)編譯錯誤publicclassPerson{ publicvoidinfo(){ System.out.println("這是Person類的對象"); }}publicclassStudentextendsPerson{ @Override publicvoidinfo(){ System.out.println("這是Student類的對象"); }}7根本注解被@Deprecated修飾的方法會出現(xiàn)過時標記,即方法名上出現(xiàn)一條刪除線
@Deprecated publicvoidpaly(){ System.out.println("這個方法已過時");
}8根本注解在程序中使用沒有泛型限制的集合將會引起編譯器警告,可以使用@SuppressWarnings忽略警告
@SuppressWarnings("unchecked")
classSuppressWaringsTest{ publicstaticvoidmain(String[]args){ List<String>list=newArrayList(); }
}9元注解除了三個根本注解之外,java還提供了四中元注解,元注解專職負責注解其他注解10元注解@Target可用的ElementType參數(shù)包括:11元注解@Retention可選的RetentionPolicy參數(shù)包括:12自定義注解定義新的Annotation類型使用@interface關(guān)鍵字語法:例如:[元注解]public@interface注解名稱{[成員變量]}public@interfaceMyAnnotation{}上面代碼定義一個注解MyAnnotation,該注解默認保存在class文件中,可用于修飾程序中的類、方法、變量、接口等的定義。13自定義注解我們根據(jù)Annotation是否包含成員變量,可以把Annotation分為兩類:標記Annotation和元數(shù)據(jù)Annotation。標記Annotation:一個沒有成員定義的Annotation類型被稱為標記。這種Annotation僅使自身的存在與否來為我們提供信息。如@Override等。元數(shù)據(jù)Annotation:那些包含成員變量的Annotation,因為他們可以接受更多的元數(shù)據(jù),所以也被稱為元數(shù)據(jù)Annotation。14自定義注解定義帶成員變量的Annotation例如:@Retention(RetentionPolicy.RUNTIME)//指定該注解為運行時注解public@interfaceMyAnnotation{ Stringname(); intage();}publicclassStudent{ @MyAnnotation(name="張飛",age=18) publicvoidinfo(){}}@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{ Stringname()default"張三"; intage()default18;}給成員變量指定默認值15提取注解信息AnnotatedElement接口是所有程序元素〔如Class、Method〕的父接口,程序通過反射獲取了某個類的AnnotatedElement對象之后,就可以通過該對象的方法來訪問Annotation信息。classDemo{ publicstaticvoidmain(String[]args){ Studentstudent=newStudent(); try{ Annotation[]aArray=student.getClass().getMethod("info").getAnnotations(); for(Annotationan:aArray){ System.out.println(an); } }catch(Exceptione){ e.printStackTrace(); } }}16提取注解信息如果我們需要獲取某個注解里的元數(shù)據(jù),那么可以將注解類型強制轉(zhuǎn)換成所需的注解類型,然后通過注解對象的抽象方法來訪問這些元數(shù)據(jù)。例如:publicstaticvoidmain(String[]args){Studentstudent=newStudent();try{ Annotation[]aArray=student.getClass().getMethod("info").getAnnotations(); for(Annotationan:aArray){
//判斷注解類型
if(aninstanceofMyAnnotation){
System.out.println("Annotationis:"+an); //將注解類型強制轉(zhuǎn)換為MyAnnotation
System.out.println("():"+((MyAnnotation)an).name());
System.out.println("an.age():"+((MyAnnotation)an).age()); } }}catch(Exceptione){ e.printStackTrace();}}17泛型Java的集合有個缺點:當我們把一個對象“丟進”集合里后,集合就會“忘記”這個對象的數(shù)據(jù)類型,當再次取出該對象時,該對象的編譯類型就變成了Object類型。為了解決這個問題,從JDK1.5以后,Java引入了“參數(shù)化類型〔parametrizedtype〕”的概念,允許我們在創(chuàng)立集合時指定集合元素的類型。如List<String>,這說明該List集合只能保存字符串類型的對象。Java的參數(shù)化類型被稱為泛型〔Generic〕。18定義泛型接口、類泛型允許在定義接口、類時指定類型形參,類型形參在整個接口、類中可當成類型使用。//定義接口時指定類型形參:EpublicinterfaceList<E>{ //在接口中,E可以作為類型使用 voidadd(Ee); Iterator<E>iterator();}19定義泛型接口、類當我們使用List類型時,為形參E傳入String類型實參,那么產(chǎn)生了一個新的類型:List<String>類型,我們可以把List<String>想象成E被替換成String的特殊List子接口:程序雖然定義了一個List<E>接口,但實際使用時可以產(chǎn)生無數(shù)多個List接口,只要為E傳入不同的類型參數(shù),系統(tǒng)就會多出一個新的List子接口注意:“ListString”只是邏輯上存在,物理上并不存在。publicinterfaceListStringextendsList{ //原來的形參E全部變成String類型實參 voidadd(Strings); Iterator<String>iterator();}20定義泛型接口、類publicclassApple<T>{ privateTinfo;//T可以作為類型在類中使用 publicApple(){} publicApple(Tinfo){ =info; } publicTgetInfo(){ returninfo; } publicvoidsetInfo(Tinfo){ =info; } publicstaticvoidmain(String[]args){ //如果傳遞給T的實參是String類型,所以構(gòu)造器的參數(shù)只能是String Apple<String>a1=newApple<String>("蘋果"); System.out.println(a1.getInfo()); //如果傳遞給T的實參是Double類型,所以構(gòu)造器的參數(shù)只能是Double Apple<Double>a2=newApple<Double>(5.6); System.out.println(a2.getInfo()); }}構(gòu)造器不要增加泛型聲明21定義泛型接口、類當創(chuàng)立了帶泛型聲明的接口、父類之后,可以為該接口創(chuàng)立實現(xiàn)類,或從該父類派生子類,但是當使用這些接口、父類時不能再包含類型參數(shù)。例如下面的代碼就是錯誤的:這就好比我們定義方法的時候可以使用形參,但調(diào)用方法時必須傳入實參。所以我們需要把上面代碼的T換成實際類型。上面的代碼應(yīng)改為:classAextendsApple<T>{}classAextendsApple<String>{}//傳入String類型classAextendsApple{}//不傳入實際參數(shù)也正確22深入泛型當我們使用一個泛型類時,應(yīng)該為這個泛型類傳入一個類型實參,如果沒有傳入實參,就會引起泛型警告publicvoidtest(Listc){ for(inti=0;i<c.size();i++){ System.out.println(c.get(i)); }}泛型警告23類型通配符為了表示各種泛型List的父類,我們需要使用類型通配符,類型通配符是一個問號“?”,將一個問號作為類型實參傳給List集合,寫作:List<?>〔意思是未知類型元素的List〕。這個?被稱為通配符,它可以匹配任何類型。List<?>是任何泛型List的父類型publicvoidtest(List<?>c){ for(inti=0;i<c.size();i++){ System.out.println(c.get(i)); }}類型通配符24類型通配符上限當直接使用List<?>這種形式時,即說明這個List集合可以是任何泛型List的父類。但還有一種特殊的情形,我們只想表示它是某一類泛型的父類例如:publicabstractclassShape{ publicabstractvoiddraw(Canvasc);}classCircleextendsShape{ publicvoiddraw(Canvasc){ System.out.println("在畫布上畫一個圓"); }}classRectangleextendsShape{ publicvoiddraw(Canvasc){ System.out.println("在畫布上畫一個矩形"); }}classCanvas{ publicvoiddrawAll(List<Shape>shapes){ for(Shapes:shapes){ s.draw(this); } } publicstaticvoidmain(String[]args){ List<Circle>circleList=newArrayList<Circle>();
circleList.add(newCircle()); Canvasc=newCanvas(); c.drawAll(circleList); }}List<Circle>并不是List<Shape>的子類,編譯錯誤!25類型通配符上限為了解決上述問題,可以修改代碼如下:通配符可以保證編譯通過,但帶來了類型平安問題classCanvas{ publicvoiddrawAll(List<?>shapes){ for(Shapes:shapes){ s.draw(this); } } publicstaticvoidmain(String[]args){ List<Circle>circleList=newArrayList<Circle>();
circleList.add(newCircle()); Canvasc=newCanvas(); c.drawAll(circleList); }}使用通配符,表示任意類型如果傳遞進來的不是Shape,會發(fā)生類型轉(zhuǎn)換異常問題26類型通配符上限實際上,我們需要一種泛型表示方法,它可以表示所有Shape泛型List的父類而不是所有泛型List的父類。為了滿足這種需求,Java泛型提供了被限制的通配符語法:List<?extends被限制的類型名稱>publicvoiddrawAll(List<?extendsShape>shapes){ for(Shapes:shapes){ s.draw(this); }}泛型信息匹配Shape的子類27泛型方法JDK1.5還提供了泛型方法的支持。例如:將一個Object數(shù)組的所有元素添加到一個Collection集合中。類型通配符在這里是不適用的,因為無法將對象添加到不知道具體類型的集合中staticvoidfromArrayToCollection(Object[]objs,Collection<Object>c){ for(Objecto:objs){ c.add(o); }}只能添加Object類型,不能添加其他類型28泛型方法語法:修改前面代碼:與接口、類定義的類型形參相比,泛型方法定義的類型形參只能在方法內(nèi)部使用修飾符<T,S>返回值類型方法名〔形參列表〕{}static<T>voidfromArrayToCollection(T[]a,Collection<T>c){ for(To:a){ c.add(o); }}29泛型方法前面代碼編譯器根據(jù)實參可以推斷出最直接的類型形參的類型。為了讓編譯器能夠準確的推斷出泛型方法中類型形參的類型,不要制造迷惑!
static<T>voidtest(Collection<T>a,Collection<T>b){ for(To:a){ b.add(o); } } publicstaticvoidmain(String[]args){ List<Object>objList=newArrayList<Object>(); List<String>strList=newArrayList<String>(); //這里將發(fā)生編譯錯誤 test(strList,objList);
}
static<T>voidtest(Collection<?extendsT>a,Collection<T>b){ for(To:a){ b.add(o); } } publicstaticvoidmain(String[]args){ List<Object>objList=newArrayList<Object>(); List<String>strList=newArrayList<String>(); test(strList,objList); }通配符限定30類型通配符下限前面所使用的test方法可以將集合a中的元素復(fù)制到集合b,假設(shè)該方法還需要一個返回值,返回最后一個被復(fù)制的元素,修改該方法如下:static<T>Ttest(Collection<?extendsT>a,Collection<T>b){ Tlast=null; for(To:a){ last=o; b.add(o); } returnlast;}publicstaticvoidmain(String[]args)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度成都事業(yè)單位勞動合同范本(含員工行為規(guī)范)
- 2025年度綠色能源PPP項目投資合作協(xié)議范本3篇
- Unit4SectionB2a-2e說課稿2024-2025學年人教版英語八年級上冊
- 二零二五年度建筑工程施工合同:水渠硬化工程專業(yè)分包協(xié)議2篇
- 期末評估測試卷(二) (含答案)2024-2025學年數(shù)學冀教版八年級下冊
- 甘肅省甘南藏族自治州(2024年-2025年小學六年級語文)部編版摸底考試(上學期)試卷及答案
- 西藏那曲地區(qū)(2024年-2025年小學六年級語文)統(tǒng)編版階段練習((上下)學期)試卷及答案
- 貴州輕工職業(yè)技術(shù)學院《建筑外觀裝飾設(shè)計》2023-2024學年第一學期期末試卷
- 新疆巴音郭楞蒙古自治州(2024年-2025年小學六年級語文)部編版能力評測(下學期)試卷及答案
- 貴州農(nóng)業(yè)職業(yè)學院《明史趣談》2023-2024學年第一學期期末試卷
- 2024年郵政系統(tǒng)招聘考試-郵政營業(yè)員考試近5年真題集錦(頻考類試題)帶答案
- 2023視頻監(jiān)控人臉識別系統(tǒng)技術(shù)規(guī)范
- 醫(yī)學教案SPZ-200型雙向道床配碴整形車操作保養(yǎng)維修手冊
- 2024年四川省宜賓市敘州區(qū)六年級數(shù)學第一學期期末監(jiān)測試題含解析
- 獸醫(yī)學英語詞匯【參考】
- 10《吃飯有講究》(教學設(shè)計)-2024-2025學年道德與法治一年級上冊統(tǒng)編版
- 2024-2030年中國干燥設(shè)備行業(yè)研發(fā)創(chuàng)新狀況及發(fā)展行情監(jiān)測研究報告
- 2024仁愛版新教材七年級上冊英語新課程內(nèi)容解讀課件(深度)
- 藥物生殖毒性研究技術(shù)指導原則
- 《UI界面設(shè)計》教案
- 食品技術(shù)咨詢服務(wù)
評論
0/150
提交評論