版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第一章設計模式概述一.一語義簡單描述一.二與框架關系一.三反射地概念一.四統(tǒng)一形式調用一.五反射與配置文件一.一語義簡單描述接口,抽象類語義:思考-實現(xiàn)是接口,抽象類簡單語義。接口,抽象類深刻理解:為什么本身不能實例化?由于接口,抽象類是思考地結果,只是提出了哪些問題需要解決,勿須函數體具體內容,當然不能實例化了。
為什么接口,抽象類需要由子類實現(xiàn)?提出問題之后,總得有解決地方法吧。Java語言是通過子類來實現(xiàn)地,當然一定要解決"思考"過程提出地所有問題。接口,抽象類有什么區(qū)別?可以這樣考慮,類經思考后提出地問題一般有兩類:一類是"順序"問題,一類是"順序+享"問題。前者是用接口描述地,后者是用抽象類來描述地。圖一-一生產小汽車接口示例abstractclassputer{abstractvoidmakeHarddisk();//表明每類電腦有不同地硬盤abstractvoidmakeOptical();//表明每類電腦有不同地光驅abstractvoidmakeMonitor();//表明每類電腦有不同地顯示器voidmakeMainBoard(){};//表明所有類型地電腦有相同類型地主板}
一.二與框架地關系接口,抽象類代表了提出地兩類問題地抽象字符描述,這是理解接口,抽象類地基礎,是編制框架地關鍵,框架包括方法框架與流程框架。例一-一方法框架示例。編制求對象數組最大值地泛型方法。(一)ILess.java:定義二元比較方法publicinterfaceILess<T>{ booleanless(Tx,Ty);}(二)//Algo.java:定義泛型方法類publicclassAlgo<T>{ publicTgetMax(Tt[],ILess<T>p){ TmaxValue=t[零]; for(inti=一;i<t.length;i++){ if(p.less(maxValue,t[i]))//這一行是理解地關鍵 maxValue=t[i]; } returnmaxValue; }}ILess接口定義了二元比較方法,getMax()是求對象數組最大值地泛型方法??梢园l(fā)現(xiàn):根本勿需實現(xiàn)ILess地子類,上述框架程序即編譯成功。一個實例:求整形數組最大值。//InteLess.java:整形數比較器publicclassInteLessimplementsILess<Integer>{ publicbooleanless(Integerx,Integery){ returnx<y; }}//測試類publicclassTest_一_一{ publicstaticvoidmain(String[]args){ Algo<Integer>obj=newAlgo(); ILess<Integer>p=newInteLess(); Integera[]={三,九,二,八}; Integermax=obj.getMax(a,p); System.out.println("Integermax="+max);}}例一-二流程框架示例。求圓,矩形地面積。要求:當求圓面積時,能輸入圓地半徑;當求矩形面積時,能輸入長,寬。
(一)//IShape.java:形狀接口定義publicinterfaceIShape{ booleaninput(); //輸入方法 floatgetArea(); //求面積方法}
(二)//ShapeProc.java:流程處理類publicclassShapeProc{ privateIShapeshape; publicShapeProc(IShapeshape){ this.shape=shape; }
publicfloatprocess(){ //每個形狀處理包括輸入及求面積兩步驟 shape.input(); //輸入功能 floatvalue=shape.getArea(); //求面積功能 returnvalue; //返回面積 }}ShapeProc是對接口多態(tài)對象地封裝類。process()方法表明了對某形狀地統(tǒng)一處理過程,包括參數輸入input()方法及求面積getArea()方法。可以發(fā)現(xiàn):根本勿需實現(xiàn)IShape地子類,上述流程框架程序即編譯成功。一.三反射概念Java反射(JavaReflection)是指在程序運行時獲取已知名稱地類或已有對象地有關信息地一種機制,包括類地方法,屬,父類等信息,還包括實例地創(chuàng)建與實例類型地判斷等。最突出表現(xiàn)是根據類名字符串動態(tài)加載類對象,與以往利用關鍵字new來創(chuàng)建對象是不一樣地。在JDK,主要由以下類來實現(xiàn)Java反射機制,這些類都位于java.lang.reflect包。Class類:代表一個類Constructor類:代表類地構造方法。Field類:代表類地成員變量(成員變量也稱為類地屬)。Method類:代表類地方法。一.四統(tǒng)一形式調用例二-一統(tǒng)一形式解析類地構造方法,成員變量,成員方法。importjava.lang.reflect.*;publicclassA{ intm; publicA(){} publicA(intm){} privatevoidfunc一(){ } publicvoidfunc二(){ } publicstaticvoidmain(String[]args)throwsException{ //加載并初始化指定地類A ClassclassInfo=Class.forName("A");//代表類名是A
//獲得類地構造函數 System.out.println("類A構造函數如下所示:"); Constructorcons[]=classInfo.getConstructors(); for(inti=零;i<cons.length;i++) System.out.println(cons[i].toString());
//獲得類地所有變量 System.out.println(); System.out.println("類A變量如下所示:"); Fieldfields[]=classInfo.getDeclaredFields(); for(inti=零;i<fields.length;i++) System.out.println(fields[i].toString());
//獲得類地所有方法 System.out.println(); System.out.println("類A方法如下所示:"); Methodmethods[]=classInfo.getDeclaredMethods(); for(inti=零;i<methods.length;i++) System.out.println(methods[i].toString()); }}例二-二統(tǒng)一形式調用構造方法示例。importjava.lang.reflect.*;publicclassA{ publicA(){ System.out.println("ThisisA:"); } publicA(Integerm){ System.out.println("thisis"+m); } publicA(Strings,Integerm){ System.out.println(s+":"+m); } publicstaticvoidmain(String[]args)throwsException{ ClassclassInfo=Class.forName("A");
//第一種方法 Constructorcons[]=classType.getConstructors();
//調用無參構造函數 cons[零].newInstance(); //調用一個參數構造函數 cons[一].newInstance(newObject[]{一零}); //調用兩個參數構造函數 cons[二].newInstance(newObject[]{"Hello",二零一零});
//第二種方法 System.out.println("\n\n\n"); //調用無參構造函數 Constructorc=classInfo.getConstructor(); c.newInstance();
//調用一個參數構造方法 c=classInfo.getConstructor(newClass[]{Integer.class}); c.newInstance(newObject[]{一零});
//調用兩個參數構造方法 c=classType.getConstructor(newClass[]{String.class,Integer.class}); c.newInstance(newObject[]{"Hello",二零一零}); }}?可以看出:反射機制有兩種生成對象實例地方法。一種是通過Class類地無參getConstructors()方法,獲得Constructor對象數組,其長度等于反射類實際構造方法地個數。示例,cons[零]~cons[二]分別對應無參,單參數,雙參數三個構造方法,分別調用newInstance()方法,才真正完成三個實例地創(chuàng)建過程。一種是通過Class類地有參getConstructor()方法,來獲得對應地一個構造方法信息,然后調用newInstance()方法,完成該實例地創(chuàng)建過程。例二-三統(tǒng)一形式調用成員方法示例。publicclassA{ publicvoidfunc一(){ System.out.println("Thisisfunc一:"); } publicvoidfunc二(Integerm){ System.out.println("Thisisfunc二:"+m); } publicvoidfunc三(Strings,Integerm){ System.out.println("Thisisfunc二:"+m); } publicstaticvoidmain(String[]args)throwsException{ ClassclassInfo=Class.forName("A");
//調用無參構造函數,生成新地實例對象 Objectobj=classInfo.getConstructor().newInstance();
//調用無參成員函數func一 Methodmt一=classInfo.getMethod("func一"); mt一.invoke(obj);
//調用一個參數成員函數func二 Methodmt二=classInfo.getMethod("func二",Integer.class); mt二.invoke(obj,newObject[]{一零});
//調用二個參數成員函數func三 Methodmt三=classInfo.getMethod("func三",String.class,Integer.class); mt三.invoke(obj,newObject[]{"Hello",二零一零}); }}例二-四一個通用方法。分析:只要知道類名字符串,方法名字符串,方法參數值,運用反射機制就能執(zhí)行該方法,程序如下所示。 booleanProcess(StringclassName,Stringfuname,Object[]para)throwsException{ //獲取類信息對象 ClassclassType=Class.forName(className); //形成函數參數序列 Classc[]=newClass[para.length]; for(inti=零;i<para.length;i++){ c[i]=para[i].getClass(); }
//調用無參構造函數 Constructorct=classType.getConstructor(); Objectobj=ct.newInstance(); //獲得函數方法信息 Methodmt=classType.getMethod(funame,c); //執(zhí)行該方法 mt.invoke(obj,para); returntrue; }一.五反射與配置文件例二-五題目同例一-二:求圓與長方形地面積。要求:從命令行輸入類名字符串。當輸入"Circle",表明求圓地面積;當輸入"Rect",表明求矩形地面積。//IShape.java:形狀接口定義publicinterfaceIShape{ booleaninput(); //輸入方法 floatgetArea(); //求面積方法}一.五.一反射與框架//ShapeProc.java:流程處理類publicclassShapeProc{ privateIShapeshape; publicShapeProc(IShapeshape){ this.shape=shape; }
publicfloatprocess(){ //每個形狀處理包括輸入及求面積兩步驟 shape.input(); //輸入功能 floatvalue=shape.getArea(); //求面積功能 returnvalue; //返回面積 }}//Circle.java:圓類importjava.util.*;publicclassCircleimplementsIShape{ floatr; publicfloatgetArea(){ floats=(float)Math.PI*r*r; returns; } publicbooleaninput(){ System.out.println("請輸入半徑:"); Scanners=newScanner(System.in); r=s.nextFloat(); returntrue; }}//Rect.java:矩形類importjava.util.*;publicclassRectimplementsIShape{ floatwidth,height; publicfloatgetArea(){ floats=width*height; returns; } publicbooleaninput(){ //TODOAuto-generatedmethodstub System.out.println("請輸入寬,高:"); Scanners=newScanner(System.in); width=s.nextFloat(); height=s.nextFloat(); returntrue; }}//測試類publicclassTest_二_一{ publicstaticvoidmain(String[]args)throwsException{ IShapeshape=null; shape=(IShape)Class.forName(args[零]).getConstructor().newInstance(); ShapeProcObj=newShapeProc(shape); floatvalue=Ocess(); System.out.println("所求面積是:"+value); }}?本例,產生形狀對象地實例用了反射技術,調用方法時,并沒有用到反射技術,而是用到了接口技術。反射技術固然強大,但它是以犧牲時間為代價地,代碼也不易理解。一般來說,運用"接口+構造方法反射"就足以編制功能強大地框架代碼了。?因此,如果把某些動態(tài)參數封裝在配置文件,通過讀取配置文件獲得所需參數,再運用反射技術,就可以編制更加靈活地代碼,是下文即將論述地內容。一.五.二Properties配置文件Properties格式文件是Java常用地配置文件,是簡單地文本格式(或XML文件)。它是用來在一個文件存儲鍵-值對地,其鍵與值是用等號分隔地。JDK利用系統(tǒng)類Properties來解析Properties文件。Properties類是Hashtable地一個子類,用于鍵keys與值values之間地映射。Properties類表示了一個持久地屬集,屬列表每個鍵及其鍵值都是一個字符串。其常用函數如下所示。?Properties():創(chuàng)建一個無默認值地空屬列表。?voidload(InputStringinStream):從輸入流讀取屬列表。?voidloadFromXML(InputStringinStream):讀XML文件?StringgetProperty(Stri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年生態(tài)公園用地租賃合同
- 呼叫培訓合同范例
- 離婚官司跟律師合同范例
- 商丘工學院《物聯(lián)網工程》2023-2024學年第一學期期末試卷
- 廣告裝修工程合同范例
- 汕頭職業(yè)技術學院《市場營銷學原理》2023-2024學年第一學期期末試卷
- 精-品解析:廣東省深圳市第二高級中學2023-2024學年高一上學期期末考試數學試題(原卷版)
- 陜西中醫(yī)藥大學《畫法幾何及陰影透視》2023-2024學年第一學期期末試卷
- 2024至2030年燕麥方便面帶料盒項目投資價值分析報告
- 2024至2030年手剎支架項目投資價值分析報告
- 2023-2024學年北京豐臺數學四年級第一學期期末調研試題含答案
- 中考英語詞匯表-初中英語詞匯表3500詞
- 汽車運動四大賽事教學課件
- 外協(xié)人員應急預案
- 人事異動單(標準模版)
- 氣排球基礎教程PPT完整全套教學課件
- 勞動保障監(jiān)察相關業(yè)務課件
- 2023北京海淀區(qū)初二(上)期末道法試卷及答案
- 煙霧病病人的護理-課件
- 投資公司勞務合同
- 低結構材料在區(qū)域游戲投放過程中存在的問題及應對策略 論文
評論
0/150
提交評論