《Java基礎加強》PPT課件_第1頁
《Java基礎加強》PPT課件_第2頁
《Java基礎加強》PPT課件_第3頁
《Java基礎加強》PPT課件_第4頁
《Java基礎加強》PPT課件_第5頁
已閱讀5頁,還剩29頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、高級軟件人才實作培訓高級軟件人才實作培訓JavaJava基礎加強基礎加強講師:講師:XXX高級軟件人才實作培訓高級軟件人才實作培訓課程大綱課程大綱leclipse的使用技巧的使用技巧l靜態導入靜態導入l可變參數與可變參數與for循環增強循環增強l基本數據類型的自動拆箱與裝箱基本數據類型的自動拆箱與裝箱l枚舉枚舉l反射反射lJavaBean內省內省lbeanutils工具包工具包l注解注解l泛型泛型l類加載器類加載器l代理代理高級軟件人才實作培訓高級軟件人才實作培訓eclipseeclipse的使用技巧的使用技巧快捷鍵使用技巧:快捷鍵的位置:window-preferences-General-

2、Keys:l最常用eclipse快捷鍵l內容提示 Alt+/l添加塊注釋 Ctrl+Shift+/l除去塊注釋 Ctrl+Shift+l復制行 Ctrl+Alt+向下鍵l更改為大寫 Ctrl+Shift+Xl更改為小寫 Ctrl+Shift+Yl類和方法說明 F2高級軟件人才實作培訓高級軟件人才實作培訓靜態導入靜態導入import static語句導入一個類中的某個或所有靜態方法語句導入一個類中的某個或所有靜態方法l語法舉例:語法舉例: import static java.lang.Math.random;import static java.lang.Math.*; public stat

3、ic void main(String args) System.out.println(random()*100);import static語句導入一個類中的靜態成員變量語句導入一個類中的靜態成員變量l語法舉例:語法舉例: public class Constant public static String content = itcast; import static cn.itcast.Constant.content;高級軟件人才實作培訓高級軟件人才實作培訓增強增強forfor循環循環l語法:語法:for ( type 變量名:集合變量名變量名:集合變量名 ) l注意事項:注意事項:

4、迭代變量必須在迭代變量必須在( )中定義!中定義!集合變量可以是數組或實現了集合變量可以是數組或實現了Iterable接口的集合類接口的集合類l舉例:舉例: public static int add(int x,int .args) int sum = x;for(int arg:args) sum += arg;return sum;高級軟件人才實作培訓高級軟件人才實作培訓可變參數可變參數l可變參數的特點:可變參數的特點:只能出現在參數列表的最后;只能出現在參數列表的最后;.位于變量類型和變量名之間,前后有無空格都可以位于變量類型和變量名之間,前后有無空格都可以;調用可變參數的方法時,編譯

5、器為該可變參數隱含創建調用可變參數的方法時,編譯器為該可變參數隱含創建一個數組,在方法體中以數組的形式訪問可變參數。一個數組,在方法體中以數組的形式訪問可變參數。高級軟件人才實作培訓高級軟件人才實作培訓基本數據類型的自動拆箱與裝箱基本數據類型的自動拆箱與裝箱l自動裝箱:Integer num1 = 12;l自動拆箱:Int num = new Integer(23);l基本Boolean/Byte/Integer(數值范圍:-128至127)數據類型的對象緩存:Integer num1 = 12;Integer num2 = 12;System.out.println(num1 = num2)

6、;Integer num3 = 129;Integer num4 = 129;System.out.println(num3 = num4);高級軟件人才實作培訓高級軟件人才實作培訓枚舉枚舉使用枚舉的關鍵技術如下:1:enum關鍵字表示枚舉類型,它的作用相當于類聲明中的class關鍵字。2:枚舉類型不能有public的構造方法。3:所有的枚舉值都是public、static、final的,這些修飾符都是自動加上,無須程序員手動添加。4:枚舉之間用“,”分開,最好一個枚舉值用分號“;”。5:每一個枚舉值是一個枚舉類型的實例。6:可以在枚舉類型定義非枚舉值變量,這些變量可以使用任何修飾符。7:變量

7、和方法的定義必須在枚舉值后面定義。高級軟件人才實作培訓高級軟件人才實作培訓枚舉枚舉的高級應用的高級應用l枚舉就相當于一個類,其中也可以定義構造方法、成員變量、普通方法和抽枚舉就相當于一個類,其中也可以定義構造方法、成員變量、普通方法和抽象方法。象方法。l枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其枚舉元素必須位于枚舉體中的最開始部分,枚舉元素列表的后要有分號與其他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報他成員分隔。把枚舉中的成員方法或變量等放在枚舉元素的前面,編譯器報告錯誤。告錯誤。l帶構造方法的枚舉帶構造方法的枚舉構造方法必須定義成私有的如果有多

8、個構造方法,該如何選擇哪個構造方法?枚舉元素MON和MON()的效果一樣,都是調用默認的構造方法。l帶方法的枚舉帶方法的枚舉定義枚舉TrafficLamp實現普通的next方法實現抽象的next方法:每個元素分別是由枚舉類的子類來生成的實例對象,這些子類采用類似內部類的方式進行定義。增加上表示時間的構造方法l枚舉只有一個成員時,就可以作為一種單例的實現方式。枚舉只有一個成員時,就可以作為一種單例的實現方式。高級軟件人才實作培訓高級軟件人才實作培訓反射的基石反射的基石ClassClass類類lJava程序中的各個程序中的各個Java類屬于同一類事物,描述這類事物的類屬于同一類事物,描述這類事物的

9、Java類名就是類名就是Class。l對比提問:眾多的人用一個什么類表示?眾多的對比提問:眾多的人用一個什么類表示?眾多的Java類用一個什么類表示?類用一個什么類表示?人人PersonJava類類Classl對比提問:對比提問: Person類代表人,它的實例對象就是張三,李四這樣一個個具體的類代表人,它的實例對象就是張三,李四這樣一個個具體的人,人,Class類代表類代表Java類,它的各個實例對象又分別對應什么呢?類,它的各個實例對象又分別對應什么呢?對應各個類在內存中的字節碼,例如,Person類的字節碼,ArrayList類的字節碼,等等。一個類被類加載器加載到內存中,占用一片存儲空

10、間,這個空間里面的內容就是類的字節碼,不同的類的字節碼是不同的,所以它們在內存中的內容是不同的,這一個個的空間可分別用一個個的對象來表示,這些對象顯然具有相同的類型,這個類型是什么呢?l如何得到各個字節碼對應的實例對象(如何得到各個字節碼對應的實例對象( Class類型)類型)類名.class,例如,System.class對象.getClass(),例如,new Date().getClass()Class.forName(類名),例如,Class.forName(java.util.Date);l九個預定義九個預定義Class實例對象:實例對象:參看Class.isPrimitive方法的

11、幫助Int.class = Integer.TYPEl數組類型的數組類型的Class實例對象實例對象Class.isArray()l總之,只要是在源程序中出現的類型,都有各自的Class實例對象,例如,int,void高級軟件人才實作培訓高級軟件人才實作培訓反射反射 l反射就是把Java類中的各種成分映射成相應的java類。例如,一個Java類中用一個Class類的對象來表示,一個類中的組成部分:成員變量,方法,構造方法,包等等信息也用一個個的Java類來表示,就像汽車是一個類,汽車中的發動機,變速箱等等也是一個個的類。表示java類的Class類顯然要提供一系列的方法,來獲得其中的變量,方法

12、,構造方法,修飾符,包等信息,這些信息就是用相應類的實例對象來表示,它們是Field、Method、Contructor、Package等等。 l一個類中的每個成員都可以用相應的反射API類的一個實例對象來表示,通過調用Class類的方法可以得到這些實例對象后,得到這些實例對象后有什么用呢?怎么用呢?這正是學習和應用反射的要點。高級軟件人才實作培訓高級軟件人才實作培訓ConstructorConstructor類類lConstructor類類代表某個類中的一個構造方法l得到某個類所有的構造方法:例子:Constructor constructors= Class.forName(java.la

13、ng.String).getConstructors();l得到某一個構造方法:例子: Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);/獲得方法時要用到類型l創建實例對象:通常方式:String str = new String(new StringBuffer(abc);反射方式: String str = (String)constructor.newInstance(new StringBuffer(abc);/調用獲得的方法時要用到上面相同類型

14、的實例對象lClass.newInstance()方法:例子:String obj = (String)Class.forName(java.lang.String).newInstance();該方法內部先得到默認的構造方法,然后用該構造方法創建實例對象。該方法內部的具體代碼是怎樣寫的呢?用到了緩存機制來保存默認構造方法的實例對象。高級軟件人才實作培訓高級軟件人才實作培訓FieldField類類lField類類代表某個類中的一個成員變量l演示用eclipse自動生成Java類的構造方法l問題:得到的Field對象是對應到類上面的成員變量,還是對應到對象上的成員變量?類只有一個,而該類的實例對

15、象有多個,如果是與對象關聯,哪關聯的是哪個對象呢?所以字段fieldX 代表的是x的定義,而不是具體的x變量。l示例代碼:ReflectPoint point = new ReflectPoint(1,7);Field y = Class.forName(cn.itcast.corejava.ReflectPoint).getField(y);System.out.println(y.get(point);/Field x = Class.forName(cn.itcast.corejava.ReflectPoint).getField(x);Field x = Class.forName(c

16、n.itcast.corejava.ReflectPoint).getDeclaredField(x);x.setAccessible(true);System.out.println(x.get(point);l作業:將任意一個對象中的所有String類型的成員變量所對應的字符串內容中的b改成a。高級軟件人才實作培訓高級軟件人才實作培訓MethodMethod類類lMethod類類代表某個類中的一個成員方法l得到類中的某一個方法:例子: Method charAt = Class.forName(java.lang.String).getMethod(charAt, int.class);l

17、調用方法:通常方式:System.out.println(str.charAt(1);反射方式: System.out.println(charAt.invoke(str, 1); 如果傳遞給Method對象的invoke()方法的第一個參數為null,這有著什么樣的意義呢?說明該Method對象對應的是一個靜態方法!ljdk1.4和jdk1.5的invoke方法的區別:Jdk1.5:public Object invoke(Object obj,Object. args)Jdk1.4:public Object invoke(Object obj,Object args),即按jdk1.4的

18、語法,需要將一個數組作為參數傳遞給invoke方法時,數組中的每個元素分別對應被調用方法中的一個參數,所以,調用charAt方法的代碼也可以用Jdk1.4改寫為 charAt.invoke(“str”, new Object1)形式。高級軟件人才實作培訓高級軟件人才實作培訓內省內省了解JavaBeanlJavaBean是一種特殊的Java類,主要用于傳遞數據信息,這種java類中的方法主要用于訪問私有的字段,且方法名符合某種命名規則。l如果要在兩個模塊之間傳遞多個信息,可以將這些信息封裝到一個JavaBean中,這種JavaBean的實例對象通常稱之為值對象(Value Object,簡稱VO

19、)。這些信息在類中用私有字段來存儲,如果讀取或設置這些字段的值,則需要通過一些相應的方法來訪問,大家覺得這些方法的名稱叫什么好呢?JavaBean的屬性是根據其中的setter和getter方法來確定的,而不是根據其中的成員變量。如果方法名為setId,中文意思即為設置id,至于你把它存到哪個變量上,用管嗎?如果方法名為getId,中文意思即為獲取id,至于你從哪個變量上取,用管嗎?去掉set前綴,剩余部分就是屬性名,如果剩余部分的第二個字母是小寫的,則把剩余部分的首字母改成小的。setId()的屬性名idisLast()的屬性名lastsetCPU的屬性名是什么?CPUgetUPS的屬性名是

20、什么?UPS總之,一個類被當作javaBean使用時,JavaBean的屬性是根據方法名推斷出來的,它根本看不到java類內部的成員變量。l一個符合JavaBean特點的類可以當作普通類一樣進行使用,但把它當JavaBean用肯定需要帶來一些額外的好處,我們才會去了解和應用JavaBean!好處如下:在Java EE開發中,經常要使用到JavaBean。很多環境就要求按JavaBean方式進行操作,別人都這么用和要求這么做,那你就沒什么挑選的余地!JDK中提供了對JavaBean進行操作的一些API,這套API就稱為內省。如果要你自己去通過getX方法來訪問私有的x,怎么做,有一定難度吧?用內

21、省這套api操作JavaBean比用普通類的方式更方便。高級軟件人才實作培訓高級軟件人才實作培訓內省綜合案例內省綜合案例PropertyDescriptor propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();for(PropertyDescriptor propertydesc : propertyDescriptors)Method method = propertydesc.getReadMethod();/獲取屬性的get方法高級軟件人才實作培訓高級軟件人才實作培訓 Commons

22、-beanutils將字符串轉換成給定類型的值ConvertUtils.convert(String value, Class clazz)為bean中的指定屬性賦值BeanUtils.copyProperty(form, name, 經濟);將指定bean中的屬性值拷貝到目標bean中同名的屬性BeanUtils.copyProperties(dest, orig)將Map中的值拷貝到目標bean中與key同名的屬性PersonForm form = new PersonForm();Map properties = new HashMap();properties.put(id, 56);

23、properties.put(name, liming);BeanUtils.populate(form, properties);高級軟件人才實作培訓高級軟件人才實作培訓了解注解及java提供的幾個基本注解l先通過SuppressWarnings的應用讓大家直觀地了解注解:通過System.runFinalizersOnExit(true);的編譯警告引出SuppressWarnings(deprecation) lDeprecated直接在剛才的類中增加一個方法,并加上Deprecated標注,在另外一個類中調用這個方法。lOverridepublic boolean equals(Ref

24、lect other)方法與HashSet結合講解l總結:注解相當于一種標記,在程序中加了注解就等于為程序打上了某種標記,沒加,則等于沒有某種標記,以后,javac編譯器,開發工具和其他程序可以用反射來了解你的類及各種元素上有無何種標記,看你有什么標記,就去干相應的事。標記可以加在包,類,字段,方法,方法的參數以及局部變量上??磈ava.lang包,可看到JDK中提供的最基本的annotation。 高級軟件人才實作培訓高級軟件人才實作培訓自定義注解及其應用l定義一個最簡單的注解:public interface MyAnnotation l把它加在某個類上:MyAnnotation publ

25、ic class AnnotationTestl用反射進行測試AnnotationTest的定義上是否有MyAnnotation l根據發射測試的問題,引出Retention元注解的講解,其三種取值:RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分別對應:java源文件-class文件-內存中的字節碼。思考:Override、SuppressWarnings和Deprecated這三個注解的屬性值分別是什么?l演示和講解Target元注解Target的默認值為任何元素,設置Target等于ElementTyp

26、e.METHOD,原來加在類上的注解就報錯了,改為用數組方式設置ElementType.METHOD,ElementType.TYPE就可以了。l元注解以及其枚舉屬性值不用記,只要會看jdk提供那幾個基本注解的API幫助文檔的定義或其源代碼,按圖索驥即可查到,或者直接看java.lang.annotation包下面的類。高級軟件人才實作培訓高級軟件人才實作培訓為注解增加基本屬性l什么是注解的屬性一個注解相當于一個胸牌,如果你胸前貼了胸牌,就是傳智播客的學生,否則,就不是。如果還想區分出是傳智播客哪個班的學生,這時候可以為胸牌在增加一個屬性來進行區分。加了屬性的標記效果為:MyAnnotatio

27、n(color=red)l定義基本類型的屬性和應用屬性:在注解類中增加String color();MyAnnotation(color=red)l用反射方式獲得注解對應的實例對象后,再通過該對象調用屬性對應的方法MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);System.out.println(a.color();可以認為上面這個MyAnnotation是MyAnnotaion類的一個實例對象l為屬性指定缺省值:String color() default yello

28、w;lvalue屬性:String value() default zxx; 如果注解中有一個名稱為value的屬性,且你只想設置value屬性(即其他屬性都采用默認值或者你只有一個value屬性),那么可以省略value=部分,例如:MyAnnotation(lhm)。高級軟件人才實作培訓高級軟件人才實作培訓為注解增加高級屬性l數組類型的屬性int arrayAttr() default 1,2,3;MyAnnotation(arrayAttr=2,3,4)如果數組屬性中只有一個元素,這時候屬性值部分可以省略大括l枚舉類型的屬性Gender gender() ;MyAnnotation(ge

29、nder=Gender.MAN)l注解類型的屬性:MetaAnnotation annotationAttr() default MetaAnnotation(xxxx);MyAnnotation(annotationAttr=MetaAnnotation(“yyy”) )可以認為上面這個MyAnnotation是MyAnnotaion類的一個實例對象,同樣的道理,可以認為上面這個MetaAnnotation是MetaAnnotation類的一個實例對象,調用代碼如下:MetaAnnotation ma = myAnnotation.annotationAttr();System.out.pr

30、intln(ma.value();高級軟件人才實作培訓高級軟件人才實作培訓體驗泛型lJdk 1.5以前的集合類中存在什么問題ArrayList collection = new ArrayList();collection.add(1);collection.add(1L);collection.add(abc);int i = (Integer)arrayList.get(1);/編譯要強制類型轉換且運行時出錯!lJdk 1.5的集合類希望你在定義集合時,明確表示你要向集合中裝哪種類型的數據,無法加入指定類型以外的數據ArrayList collection2 = new ArrayList

31、();collection2.add(1);/*collection2.add(1L);collection2.add(“abc”);*/這兩行代碼編譯時就報告了語法錯誤int i2 = collection2.get(0);/不需要再進行類型轉換l泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,編譯器編譯帶類型說明的集合時會去除掉“類型”信息,使程序運行效率不受影響,對于參數化的泛型類型,getClass()方法的返回值和原始類型完全一樣。由于編譯生成的字節碼會去掉泛型的類型信息,只要能跳過編譯器,就可以往某個泛型集合中加入其它類型的數據,例如,

32、用反射得到集合,再調用其add方法即可。高級軟件人才實作培訓高級軟件人才實作培訓了解泛型lArrayList類定義和ArrayList類引用中涉及如下術語:整個稱為ArrayList泛型類型ArrayList中的E稱為類型參數變量整個ArrayList稱為參數化的類型ArrayList中的Integer稱為類型參數變量的值或實際類型參數ArrayList中的念著typeofArrayList稱為原始類型l參數化類型與原始類型的兼容性:參數化類型可以引用一個原始類型的對象,編譯報告警告,例如,Collection c = new Vector();/可不可以原始類型可以引用一個參數化類型的對象,

33、編譯報告警告,例如,Collection c = new Vector();/原來的方法接受一個集合參數,新的類型也要能傳進去l參數化類型不考慮類型參數的繼承關系:Vector v = new Vector(); /錯誤!/不寫沒錯,寫了就是明知故犯Vector v = new Vector(); /也錯誤!l編譯器不允許創建類型變量的數組。即在創建數組實例時,數組的元素不能使用參數化的類型,例如,下面語句有錯誤: Vector vectorList = new Vector10;l思考題:下面的代碼會報錯誤嗎?Vector v1 = new Vector(); Vector v = v1;高

34、級軟件人才實作培訓高級軟件人才實作培訓泛型中的?通配符l問題:定義一個方法,該方法用于打印出任意參數化類型的集合中的所有數據,該方法如何定義呢?l錯誤方式:public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/* cols.add(string);/沒錯 cols = new HashSet();/會報告錯誤!*/l正確方式:public static void printCollection(Collection cols) for(Object ob

35、j:cols) System.out.println(obj);/cols.add(string);/錯誤,因為它不知自己未來匹配就一定是Stringcols.size();/沒錯,此方法與類型參數沒有關系 cols = new HashSet();l總結:使用?通配符可以引用其他各種參數化的類型,?通配符定義的變量主要用作引用,可以調用與參數化無關的方法,不能調用與參數化有關的方法。高級軟件人才實作培訓高級軟件人才實作培訓泛型中的?通配符的擴展l限定通配符的上邊界:正確:Vector x = new Vector();/?號指定的類為Number的子類錯誤:Vector x = new Ve

36、ctor();在應用泛型時可以使用extends限定符,并且可以用&來指定多個邊界,如 void method()l限定通配符的下邊界:正確:Vector x = new Vector();/?號指定的類為Integer的父類錯誤:Vector x = new Vector();l提示:限定通配符總是包括自己。?只能用作引用,不能用它去給其他變量賦值Vector = new Vector();Vector x = y;上面的代碼錯誤,原理與Vector x11 = new Vector();相似,只能通過強制類型轉換方式來賦值。高級軟件人才實作培訓高級軟件人才實作培訓泛型集合類的綜合案

37、例l能寫出下面的代碼即代表掌握了Java的泛型集合類: HashMap hm = new HashMap(); hm.put(zxx,19); hm.put(lis,18); SetMap.Entry mes= hm.entrySet(); for(Map.Entry me : mes) System.out.println(me.getKey() + : + me.getValue(); l對在jsp頁面中也經常要對Set或Map集合進行迭代:$entry.key:$entry.value高級軟件人才實作培訓高級軟件人才實作培訓通過反射獲得泛型的參數化類型l示例代碼:Class Generi

38、calReflection private Vector dates = new Vector(); public void setDates(Vector dates) this.dates = dates; public static void main(String args) Method methodApply = GenericalReflection.class.getDeclaredMethod(applyGeneric, Vector.class); ParameterizedType pType = (ParameterizedType) (methodApply .get

39、GenericParameterTypes()0; System.out.println(setDates( + (Class) pType.getRawType().getName() + ) ); l泛型DAO的應用:public abstract class DaoBaseImpl implements DaoBase protected Class clazz;public DaoBaseImpl() Type type = this.getClass().getGenericSuperclass();ParameterizedType pt = (ParameterizedType) type;this.clazz = (Class) pt.getActualTypeArguments()0;System.out.println(clazz = + this.clazz);public class ArticleDaoImpl extends DaoBaseImpl implements ArticleDao 高級軟件人才實作培訓高級軟件人才實作培訓類加載器與普通程序不同的是,Java程序(class文件)并不是本地的可執行程序。當運行Java程序時,首先運行JVM(Java虛擬機),然后再把Java c

溫馨提示

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

評論

0/150

提交評論