javaweb25天視頻-小沙彌源代碼java基礎(chǔ)加強_第1頁
javaweb25天視頻-小沙彌源代碼java基礎(chǔ)加強_第2頁
javaweb25天視頻-小沙彌源代碼java基礎(chǔ)加強_第3頁
javaweb25天視頻-小沙彌源代碼java基礎(chǔ)加強_第4頁
javaweb25天視頻-小沙彌源代碼java基礎(chǔ)加強_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京傳智播客教育 Java基礎(chǔ)加強方立勛Eclipse的使用工作空間(workspace)、工程(project)在eclipse下Java程序的編寫和運行,及java運行環(huán)境的配置。快捷鍵的配置,常用快捷鍵:內(nèi)容提示:Alt + / 快速修復(fù):Ctrl + 1導(dǎo)包:Ctrl + shift + O格式化代碼塊:ctrl + shift + F向前向后:Alt + 方向鍵添加注釋 Ctrl+Shift+/除去注釋 Ctrl+Shift+程序的調(diào)試和運行F5(跳入) F6(跳過) F7(跳出)JunitJDK 5.0 新特性JDK5中新增了很多新的java特性,利用這些新語法可以幫助開發(fā)人員編寫

2、出更加高效、清晰,安全的代碼。 靜態(tài)導(dǎo)入自動裝箱/拆箱增強for循環(huán)可變參數(shù)枚舉泛型元數(shù)據(jù)靜態(tài)導(dǎo)入靜態(tài)導(dǎo)入用于簡化程序?qū)︻愳o態(tài)屬性和方法的調(diào)用。語法:Import static 包名.類名.靜態(tài)屬性|靜態(tài)方法|*例如:import static java.lang.System.outimport static java.lang.Math.*Jdk5自動裝箱/拆箱自動裝箱:指開發(fā)人員可以把一個基本數(shù)據(jù)類型直接賦給對應(yīng)的包裝類。自動拆箱:指開發(fā)人員可以把一個包裝類對象直接賦給對應(yīng)的基本數(shù)據(jù)類型。典型應(yīng)用:List list = new ArrayList();list.add(1);int j

3、 = (Integer)list.get(0);增強for循環(huán)引入增強for循環(huán)的原因:在JDK5以前的版本中,遍歷數(shù)組或集合中的元素,需先獲得數(shù)組的長度或集合的迭代器,比較麻煩!因此JDK5中定義了一種新的語法增強for循環(huán),以簡化此類操作。增強for循環(huán)只能用在數(shù)組、或?qū)崿F(xiàn)Iterable接口的集合類上語法格式: for(變量類型 變量:需迭代的數(shù)組或集合)增強for循環(huán)使用增強for循環(huán)的幾個注意事項(以下程序的輸出結(jié)果?)int arr = new int5;for(int num : arr)num = 1;System.out.println(arr0);List list = n

4、ew ArrayList();list.add(xxx);for(String str : list)str = yyy;System.out.println(list.get(0);可變參數(shù)測試JDK中具有可變參數(shù)的類Arrays.asList()方法。分別傳多個參、傳數(shù)組,傳數(shù)組又傳參的情況。注意:傳入基本數(shù)據(jù)類型數(shù)組的問題。從JDK 5開始, Java 允許為方法定義長度可變的參數(shù)。語法:public void foo(int args)注意事項:調(diào)用可變參數(shù)的方法時, 編譯器將自動創(chuàng)建一個數(shù)組保存?zhèn)鬟f給方法的可變參數(shù),因此,程序員可以在方法體中以數(shù)組的形式訪問可變參數(shù)可變參數(shù)只能處于參

5、數(shù)列表的最后, 所以一個方法最多只能有一個長度可變的參數(shù)枚舉類為什么需要枚舉?一些方法在運行時,它需要的數(shù)據(jù)不能是任意的,而必須是一定范圍內(nèi)的值,此類問題在JDK5以前采用自定義帶有枚舉功能的類解決,Java5以后可以直接使用枚舉予以解決。JDK 5新增的 enum 關(guān)鍵字用于定義一個枚舉類。枚舉類枚舉類具有如下特性:枚舉類也是一種特殊形式的Java類。枚舉類中聲明的每一個枚舉值代表枚舉類的一個實例對象。與java中的普通類一樣,在聲明枚舉類時,也可以聲明屬性、方法和構(gòu)造函數(shù),但枚舉類的構(gòu)造函數(shù)必須為私有的(這點不難理解)。枚舉類也可以實現(xiàn)接口、或繼承抽象類。JDK5中擴展了swith語句,它

6、除了可以接收int, byte, char, short外,還可以接收一個枚舉類型。若枚舉類只有一個枚舉值,則可以當作單態(tài)設(shè)計模式使用。練習(xí):請編寫一個關(guān)于星期幾的枚舉WeekDay,要求:枚舉值:MON,TUE,WED,THU,FRI,SAT,SUN 該枚舉要有一個方法,調(diào)用該方法返回中文格式的星期。枚舉類Java中聲明的枚舉類,均是java.lang.Enum類的孩子,它繼承了Enum類的所有方法。常用方法:name()ordinal()valueof(Class enumClass, String name)values() 此方法雖然在JDK文檔中查找不到,但每個枚舉類都具有該方法,它

7、遍歷枚舉類的所有枚舉值非常方便。反射一個類有多個組成部分,例如:成員變量,方法,構(gòu)造方法等。反射就是加載類,并解剖出類的各個組成部分。編程時什么情況下才需要加載類,并解剖出類的各個組成部分呢?加載類Java中有一個Class類用于代表某一個類的字節(jié)碼。Class類即然代表某個類的字節(jié)碼,它當然就要提供加載某個類字節(jié)碼的方法:forName()。forName方法用于加載某個類的字節(jié)碼到內(nèi)存中,并使用class對象進行封裝另外兩種得到class對象的方式類名.class對象.getClass() 解剖類Class對象提供了如下常用方法:Public Constructor getConstruc

8、tor(Class.parameterTypes) Public Method getMethod(Stringname, Class.parameterTypes) Public Field getField(Stringname) publicpublic Constructor getDeclaredConstructor(Class. parameterTypes)public Method getDeclaredMethod(String name,Class. parameterTypes)public Field getDeclaredField(String name)這些方法

9、分別用于從類中解剖出構(gòu)造函數(shù)、方法和成員變量(屬性)。解剖出的成員分別使用Constructor、 Method 、 Field 對象表示。思考:假設(shè)你是一個框架的設(shè)計者,解剖出這些成員后你會干什么?利用Constructor創(chuàng)建對象Constructor類提供了如下方法,用于創(chuàng)建類的對象:public Object newInstance(Object. initargs)initargs用于指定構(gòu)造函數(shù)接收的參數(shù)練習(xí):反射類無參、有參、私有的構(gòu)造函數(shù),創(chuàng)建類的對象。多學(xué)一招:sun公司為簡化開發(fā)人員創(chuàng)建對象,它在class對象中也提供了一個newInstance方法,用于創(chuàng)建類的對象。這樣

10、開發(fā)人員可以避免每次都需要去反射Constructor 類以創(chuàng)建對象。不過需要注意的是:class.newInstance方法內(nèi)部是反射類無參的構(gòu)造函數(shù)創(chuàng)建的對象,所以利用此種方式創(chuàng)建類對象時,類必須有一個無參的構(gòu)造函數(shù)。利用Method執(zhí)行方法Method對象提供了如下方法,用于執(zhí)行它所代表的方法:public Object invoke(Object obj,Object. args)練習(xí):使用Method分別執(zhí)行無參、有參、多個參(帶數(shù)組和基本數(shù)據(jù)類型)、靜態(tài)、私有的方法。jdk1.4和jdk1.5的invoke方法的區(qū)別:Jdk1.5:public Object invoke(Obje

11、ct obj,Object. args)Jdk1.4:public Object invoke(Object obj,Object args),練習(xí):利用Method執(zhí)行main方法問題:啟動Java程序的main方法的參數(shù)是一個字符串數(shù)組,即public static void main(String args),通過反射方式來調(diào)用這個main方法時,如何為invoke方法傳遞參數(shù)呢?按jdk1.5的語法,整個數(shù)組是一個參數(shù),而按jdk1.4的語法,數(shù)組中的每個元素對應(yīng)一個參數(shù),當把一個字符串數(shù)組作為參數(shù)傳遞給invoke方法時,javac會到底按照哪種語法進行處理呢?jdk1.5肯定要兼容

12、jdk1.4的語法,會按jdk1.4的語法進行處理,即把數(shù)組打散成為若干個單獨的參數(shù)。所以,在給main方法傳遞參數(shù)時,不能使用代碼mainMethod.invoke(null,new String“xxx”),javac只把它當作jdk1.4的語法進行理解,而不把它當作jdk1.5的語法解釋,因此會出現(xiàn)參數(shù)類型不對的問題。解決辦法:mainMethod.invoke(null,new Objectnew Stringxxx);mainMethod.invoke(null,(Object)new Stringxxx); ,編譯器會作特殊處理,編譯時不把參數(shù)當作數(shù)組看待,也就不會數(shù)組打散成若干個

13、參數(shù)了利用Field訪問屬性Field對象提供了如下方法,用于設(shè)置、獲取對象屬性的值:public void set(Object obj,Object value)public Object get(Object obj)練習(xí):利用Field分別設(shè)置和獲取公有、私有的屬性。內(nèi)省(Introspector)為什么要學(xué)內(nèi)???開發(fā)框架時,經(jīng)常需要使用java對象的屬性來封裝程序的數(shù)據(jù),每次都使用反射技術(shù)完成此類操作過于麻煩,所以sun公司開發(fā)了一套API,專門用于操作java對象的屬性。什么是Java對象的屬性和屬性的讀寫方法?內(nèi)省訪問JavaBean屬性的兩種方式:通過PropertyDescr

14、iptor類操作Bean的屬性通過Introspector類獲得Bean對象的 BeanInfo,然后通過 BeanInfo 來獲取屬性的描述器( PropertyDescriptor ),通過這個屬性描述器就可以獲取某個屬性對應(yīng)的 getter/setter 方法,然后通過反射機制來調(diào)用這些方法。內(nèi)省beanutils工具包 Sun公司的內(nèi)省API過于繁瑣,所以Apache組織結(jié)合很多實際開發(fā)中的應(yīng)用場景開發(fā)了一套簡單、易用的API操作Bean的屬性BeanUtilsBeanutils工具包的常用類:BeanUtilsPropertyUtilsConvertUtils.regsiter(Co

15、nverter convert, Class clazz)自定義轉(zhuǎn)換器泛型(Generic)泛形的作用JDK5以前,對象保存到集合中就會失去其特性,取出時通常要程序員手工進行類型的強制轉(zhuǎn)換,這樣不可避免就會引發(fā)程序的一些安全性問題。例如:ArrayList list = new ArrayList();list.add(abc);Integer num = (Integer) list.get(0); /運行時會出錯,但編碼時發(fā)現(xiàn)不了list.add(new Random();list.add(new ArrayList();for(int i=0;ilist.size();i+)(?)lis

16、t.get(i); /此處取出來的對象應(yīng)轉(zhuǎn)換成什么類型泛型(Generic) 泛形的作用JDK5中的泛形允許程序員在編寫集合代碼時,就限制集合的處理類型,從而把原來程序運行時可能發(fā)生問題,轉(zhuǎn)變?yōu)榫幾g時的問題,以此提高程序的可讀性和穩(wěn)定性(尤其在大型程序中更為突出)。注意:泛型是提供給javac編譯器使用的,它用于限定集合的輸入類型,讓編譯器在源代碼級別上,即擋住向集合中插入非法數(shù)據(jù)。但編譯器編譯完帶有泛形的java程序后,生成的class文件中將不再帶有泛形信息,以此使程序運行效率不受到影響,這個過程稱之為“擦除”。泛形的基本術(shù)語,以ArrayList為例:念著typeofArrayList中

17、的E稱為類型參數(shù)變量ArrayList中的Integer稱為實際類型參數(shù)整個稱為ArrayList泛型類型整個ArrayList稱為參數(shù)化的類型ParameterizedType 泛型典型應(yīng)用使用迭代器迭代泛形集合中的元素。使用增強for循環(huán)迭代泛形集合中的元素。存取HashMap中的元素。使用泛形時的幾個常見問題:使用泛形時,泛形類型須為引用類型,不能是基本數(shù)據(jù)類型ArrayList list = new ArrayList();ArrayList list = new ArrayList(); ArrayList list = new ArrayList ();ArrayList list

18、 = new ArrayList();自定義泛形泛型方法Java程序中的普通方法、構(gòu)造方法和靜態(tài)方法中都可以使用泛型。方法使用泛形前,必須對泛形進行聲明,語法: ,T可以是任意字母,但通常必須要大寫。通常需放在方法的返回值聲明之前。例如:public static void doxx(T t);練習(xí):編寫一個泛形方法,實現(xiàn)數(shù)組元素的交換。編寫一個泛形方法,接收一個任意數(shù)組,并顛倒數(shù)組中的所有元素。注意:只有對象類型才能作為泛型方法的實際參數(shù)。在泛型中可以同時有多個類型,例如:public static V getValue(K key) return map.get(key);如果一個類多處都

19、要用到同一個泛型,這時可以把泛形定義在類上(即類級別的泛型),語法格式如下:public class GenericDao private T field1;public void save(T obj)public T getId(int id)注意,靜態(tài)方法不能使用類定義的泛形,而應(yīng)單獨定義泛形。泛形的典型應(yīng)用:BaseDao和反射泛型泛型的高級應(yīng)用通配符定義一個方法,接收一個集合,并打印出集合中的所有元素,如下所示: void print (Collection c) for (String e : c) System.out.println(e); 問題:該方法只能打印保存了Objec

20、t對象的集合,不能打印其它集合。通配符用于解決此類問題,方法的定義可改寫為如下形式: void print (Collection c) /Collection(發(fā)音為:collection of unknown) for (Object e : c) System.out.println(e);此種形式下需要注意的是:由于print方法c參數(shù)的類型為Collection,即表示一種不確定的類型,因此在方法體內(nèi)不能調(diào)用與類型相關(guān)的方法,例如add()方法??偨Y(jié):使用?通配符主要用于引用對象,使用了?通配符,就只能調(diào)對象與類型無關(guān)的方法,不能調(diào)用對象與類型有關(guān)的方法。泛型的高級應(yīng)用有限制的通配符

21、限定通配符的上邊界:正確:Vector x = new Vector();錯誤:Vector x = new Vector();限定通配符的下邊界:正確:Vector x = new Vector();錯誤:Vector x = new Vector();public void add(List list)list.add(abc);問題:以下代碼行不行?Annotation(注解) 概述從 JDK 5.0 開始, Java 增加了對元數(shù)據(jù)(MetaData) 的支持, 也就是 Annotation(注解)。什么是Annotation,以及注解的作用?三個基本的 Annotation:Over

22、ride: 限定重寫父類方法, 該注解只能用于方法Deprecated: 用于表示某個程序元素(類, 方法等)已過時SuppressWarnings: 抑制編譯器警告. Annotation 其實就是代碼里的特殊標記, 它用于替代配置文件,也就是說,傳統(tǒng)方式通過配置文件告訴類如何運行,有了注解技術(shù)后,開發(fā)人員可以通過注解告訴類如何運行。在Java技術(shù)里注解的典型應(yīng)用是:可以通過反射技術(shù)去得到類里面的注解,以決定怎么去運行類。掌握注解技術(shù)的要點:如何定義注解如何反射注解,并根據(jù)反射的注解信息,決定如何去運行類自定義 Annotation定義新的 Annotation 類型使用 interface

23、 關(guān)鍵字聲明注解的屬性注解屬性的作用:原來寫在配置文件中的信息,可以通過注解的屬性進行描述。Annotation 的屬性聲明方式:String name();屬性默認值聲明方式:String name() default “xxx”;特殊屬性value:如果注解中有一個名稱value的屬性,那么使用注解時可以省略value=部分,如MyAnnotation(“xxx)特殊屬性value;JDK 的元 Annotation元 Annotation指修飾Annotation的Annotation。JDK中定義了如下元Annotation:Retention: 只能用于修飾一個 Annotation

24、 定義, 用于指定該 Annotation 可以保留的域, Rentention 包含一個 RetentionPolicy 類型的成員變量, 通過這個變量指定域。RetentionPolicy.CLASS: 編譯器將把注解記錄在 class 文件中. 當運行 Java 程序時, JVM 不會保留注解. 這是默認值RetentionPolicy.RUNTIME:編譯器將把注釋記錄在 class 文件中. 當運行 Java 程序時, JVM 會保留注解. 程序可以通過反射獲取該注釋RetentionPolicy.SOURCE: 編譯器直接丟棄這種策略的注釋JDK 的元 Annotation 2Ta

25、rget:指定注解用于修飾類的哪個成員. Target 包含了一個名為 value,類型為ElementType的成員變量。Documented: 用于指定被該元 Annotation 修飾的 Annotation 類將被 javadoc 工具提取成文檔.Inherited: 被它修飾的 Annotation 將具有繼承性.如果某個類使用了被 Inherited 修飾的 Annotation, 則其子類將自動具有該注解提取 Annotation 信息JDK 5.0 在 java.lang.reflect 包下新增了 AnnotationElement 接口, 該接口代表程序中可以接受注釋的程序

26、元素當一個 Annotation 類型被定義為運行時 Annotation 后, 該注釋才是運行時可見, 當 class 文件被載入時保存在 class 文件中的 Annotation 才會被虛擬機讀取程序可以調(diào)用 AnnotationElement 對象的如下方法來訪問 Annotation 信息北京傳智播客教育 Tip:動態(tài)代理明確兩個概念:代理對象存在的價值:主要用于攔截對真實業(yè)務(wù)對象的訪問。代理對象有什么方法?現(xiàn)在要生成某一個對象的代理對象,這個代理對象通常也要編寫一個類來生成,所以首先要編寫用于生成代理對象的類。如何編寫生成代理對象的類,兩個要素:代理誰如何生成代理對象代理誰?設(shè)計一

27、個類變量,以及一個構(gòu)造函數(shù),記住代理類 代理哪個對象。如何生成代理對象?設(shè)計一個方法生成代理對象(在方法內(nèi)編寫代碼生成代理對象是此處編程的難點)北京傳智播客教育 Tip:動態(tài)代理 Java提供了一個Proxy類,調(diào)用它的newInstance方法可以生成某個對象的代理對象,使用該方法生成代理對象時,需要三個參數(shù):1.生成代理對象使用哪個類裝載器2.生成哪個對象的代理對象,通過接口指定3.生成的代理對象的方法里干什么事,由開發(fā)人員編寫handler接口的實現(xiàn)來指定。初學(xué)者必須理解,或不理解必須記住的2件事情:Proxy類負責(zé)創(chuàng)建代理對象時,如果指定了handler(處理器),那么不管用戶調(diào)用代理

28、對象的什么方法,該方法都是調(diào)用處理器的invoke方法。由于invoke方法被調(diào)用需要三個參數(shù):代理對象、方法、方法的參數(shù),因此不管代理對象哪個方法調(diào)用處理器的invoke方法,都必須把自己所在的對象、自己(調(diào)用invoke方法的方法)、方法的參數(shù)傳遞進來。北京傳智播客教育 Tip:動態(tài)代理代理類public Object invoke(Object proxy, Method method,Object args)doSomething.void run(“aaa”)void eat(“bbb”)invoke(this,run,”aaa”)invoke(this,eat,”bbb”)處理器代

29、理對象void run(“aaa”)void eat(“bbb”)被代理對象北京傳智播客教育 Tip:動態(tài)代理應(yīng)用在動態(tài)代理技術(shù)里,由于不管用戶調(diào)用代理對象的什么方法,都是調(diào)用開發(fā)人員編寫的處理器的invoke方法(這相當于invoke方法攔截到了代理對象的方法調(diào)用)。并且,開發(fā)人員通過invoke方法的參數(shù),還可以在攔截的同時,知道用戶調(diào)用的是什么方法,因此利用這兩個特性,就可以實現(xiàn)一些特殊需求,例如:攔截用戶的訪問請求,以檢查用戶是否有訪問權(quán)限、動態(tài)為某個對象添加額外的功能。類加載器類加載器負責(zé)將 .class 文件(可能在磁盤上, 也可能在網(wǎng)絡(luò)上) 加載到內(nèi)存中, 并為之生成對應(yīng)的 ja

30、va.lang.Class 對象當 JVM 啟動時,會形成由三個類加載器組成的初始類加載器層次結(jié)構(gòu): 類加載器之間的父子關(guān)系和管轄范圍圖BootStrapExtClassLoaderAppClassLoaderItcastClassLoaderMyClassLoaderSystemclassLoaderJRE/lib/rt.jarJRE/lib/ext/*.jarCLASSPATH指定的所有jar或目錄傳智播客指定的特殊目錄bootstrap classloaderbootstrap classloader:引導(dǎo)(也稱為原始)類加載器,它負責(zé)加載Java的核心類。這個加載器的是非常特殊的,它實際

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論