泛型的簡介
? ? ? ? ? ? 為什么要使用泛型
? ? ? ? ? ? ? ? ? ? ? ? 一般使用在集合上
????????????????????????????比如現(xiàn)在把一個(gè)字符串類型的值放入到集合里面炊汹,這個(gè)時(shí)候刹衫,這個(gè)值放入到集合之后所灸,失去本來類型,只能是 object 類型譬胎,這個(gè)時(shí)候差牛,比如想要對(duì)這個(gè)值進(jìn)行類型轉(zhuǎn)換命锄,很容易出現(xiàn)類型轉(zhuǎn)換錯(cuò)誤,怎么解決這個(gè)問題偏化,可以使用泛型類來解決脐恩。
? ? ? ? ? ? ?? 在集合上如何使用泛型
? ? ? ? ? ? ? ? ? ? ? ? ? ? 常用集合 list? set? map
? ? ? ? ? ? ? ? ? ? ? ? ? ?? 泛型語法 ? 集合<String> ? 比如List<String>
? ? ? ? ? ? ? ? 在泛型里面寫是一個(gè)對(duì)象,String 不能寫基本的數(shù)據(jù)類型? 比如 int
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫基本的數(shù)據(jù)類型對(duì)應(yīng)包裝類
????????????????????????????????????????????byte —— Byte
????????????????????????????????????????????short? ? ——? ? ? Short
????????????????????????????????????????????int? ? ? ? ——? ? ? Integer
????????????????????????????????????????????long? ? ? ——? ? ? Long
????????????????????????????????????????????float? ? ? ? ——? ? ? Float
????????????????????????????????????????????double? ? ——? ? ? Double
????????????????????????????????????????????char? ? ? ——? ? ? ? Character
????????????????????????????????????????????boolean? ? ——? ? Boolean
??????????????????? 在list上面使用泛型
????????????????????????????? list的三種實(shí)現(xiàn) ? ArrayList? LinkedList? Vetor
????????????????????????????List <String> list=new ArrayList<String>();
????????????????????????????????????????list.add("aaa") ;
????????????????????????????????????????list.add("bbb") ;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? list.add("ccc") ;
????????????????????????????????????????//遍歷list
????????????????????????????????????//普通 for 循環(huán)
????????????????????????????????????for(int i=0;i<list.size();i++){
????????????????????????????????????????????????String s=list.get(i);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.print(s);
????????????????????????????????}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //使用增強(qiáng) for
????????????????????????????????????????for(String s1:list){
????????????????????????????????????????System.out.print(s1);
????????????????????????????????}
????????????????????????????//使用迭代器遍歷
????????????????????????????Iterator<String> it=list.iterator();
????????????????????????????????while(it.hasNext()){
????????????????????????????????System.out.print(it.next());
????????????????????????????}
? ? ? ? ? ? ? ? 在set上使用泛型
????????????????????????????????Set <String> set=new HashSet<String>();
????????????????????????????????????list.add("www") ;
????????????????????????????????????list.add("qqq") ;
????????????????????????????????????list.add("zzz") ;
????????????????????????????????????//遍歷 set 侦讨,有兩種方式
????????????????????????????????????//for(String s2 : set){System.out.print(s2);
????????????????????????????????}
????????????????????????//使用迭代器遍歷
????????????????????????????Iterator<String> it1=set.iterator();
????????????????????????????????while(it1.hasNext()){
????????????????????????????????System.out.print(it1.next());
????????????????????????}
? ? ? ? ? ? ? ? 在map上面使用泛型
? ? ? ? ? ? ? ? ? ? ? ? ? ? map結(jié)構(gòu):key-value形式
泛型使用在方法上
? ? ? ? ? ? ? ? 定義一個(gè)數(shù)組被盈,實(shí)現(xiàn)指定位置上數(shù)組元素的交換
? ? ? ? ? ? ? ? 方法邏輯相同, 只是數(shù)據(jù)類型不同搭伤,這個(gè)時(shí)候使用泛型方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用泛型方法 需要定義一個(gè)類型 使用大寫字母表示? T:這個(gè)T表示任意的類型
? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫在返回值之前 ? void之前<T>
泛型在類上的使用
? ? ? ? ? ? ? ?? 在一個(gè)類上定義一個(gè)類型只怎,這個(gè)類型可以在類里面直接使用
? ? ? ? ? ? ? ? public class? TestDemo04<T>{
? ? ? ? ? ? ? ? ? ? //在類里面可以直接使用T的類型
? ? ? ? ? ? ? ? ? ? T? aa;
????????????????????} ? ? ?
? ? ? ? ? ? ? ? ? public void test11(T bb){}
? ? ? ? ? ? ? ? ? ? //寫一個(gè)靜態(tài)方法 在類上面定義的泛型? 不能再靜態(tài)方法里面使用
? ? ? ? ? ? ? ? ? ? public? static< A> void test12(A? cc? ){
????????????}
枚舉的簡介
? ? ? ? ? ? ? ? 什么是枚舉
? ? ? ? ? ? ? ? ? ? ? ? ? ? 需要在一定的范圍內(nèi)取值,這個(gè)值只能是這個(gè)范圍內(nèi)中的任意一個(gè)
? ? ? ? ? ? ? ? 使用一個(gè)關(guān)鍵字enum
? ? ? ? ? ? ? ? ? ? ? ? ? ?? enum Color3{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? RED,GREEN,YELLOW
????????????????????????????}
????????????????????枚舉的構(gòu)建方法是私有的
? ? ? ? ? ? ? ? ? ? 特殊枚舉的操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在枚舉類里面有構(gòu)造方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 構(gòu)造方法里面有參數(shù)怜俐,需要在每個(gè)實(shí)例上面都寫參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在枚舉類里有抽象方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在枚舉的每個(gè)實(shí)例里面都重寫這個(gè)抽象方法
枚舉的api的操作
? ? ? ? ? ? ? ? ? ? ? ? name():返回枚舉的名稱
? ? ? ? ? ? ? ? ? ? ? ? ordinal():枚舉的下標(biāo)身堡,下標(biāo)是從0開始
? ? ? ? ? ? ? ? ? ? ? ? ValueOf(Class<T>? enumType,String name):得到枚舉的對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? 還有兩個(gè)方法,都是這兩個(gè)方法不在api里面拍鲤,編譯的時(shí)候生成兩個(gè)方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ValueOf(String name) ?? 轉(zhuǎn)換枚舉對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Values() ? 獲得所有枚舉對(duì)象數(shù)組
? ? ? ? ? ? ? ? ? ? 知道枚舉的對(duì)象贴谎,得到枚舉名稱和下標(biāo)
? ? ? ? ? ? ? ? ? ? @Test
? ? ? ? ? ? ? ? ? ? public void? test1(){
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //得到枚舉對(duì)象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Color100 c100=Color100.RED; ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //枚舉名稱
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? String name=c100.name();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //枚舉的下標(biāo)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int idx=c100.ordinal();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(name+"? "+idx);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? }
? ? ? ? ? ? ? ? ? ? ? ? 知道枚舉名稱,得到枚舉對(duì)象和下標(biāo)
????????????????????????????????publicvoidtest(){
????????????????????????????????String? name1="GREEN";
????????????????????????????????color? c1=color.valueOf(name1);
????????????????????????????????//得到枚舉對(duì)象
????????????????????????????????int idx=c1.ordinal(); //得到枚舉下標(biāo)
????????????????????????????????}enumcolor(
????????????????????????????????RED,GREEN,YELLOW
????????????????????????????????????)
????????????????????????知道枚舉下標(biāo)季稳,得到枚舉對(duì)象和名稱
????????????????????????????public void? test(){
????????????????????????????????int idx2=2;
????????????????????????????????color[]? cs=color.values();//得到枚舉對(duì)象數(shù)組
????????????????????????????????color? c2=cs[idx2];? //根據(jù)下標(biāo)得到對(duì)象
????????????????????????????String? name=c2.name(); //根據(jù)對(duì)象得到名稱
????????????????????????????}enumcolor(
????????????????????????????????RED,GREEN,YELLOW
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? )
靜態(tài)導(dǎo)入 ? ??
? ? ? ? ? ? ? ? ? ? ? ? 可以在代碼里面擅这,直接使用靜態(tài)導(dǎo)入方式,導(dǎo)入靜態(tài)方法或者常量
? ? ? ? ? ? ? ? ? ? ? ? import ? static ? ? XX.XX.xxx
自動(dòng)拆裝箱
? ? ? ? ? ? ? ? ? ? ? ? 裝箱:把基本的數(shù)據(jù)類型轉(zhuǎn)換成包裝類
? ? ? ? ? ? ? ? ? ? ? ? 拆箱:把包裝類轉(zhuǎn)換成基本的數(shù)據(jù)類型
????????????????????????//自動(dòng)裝箱
????????????????????????Integer i=10;
????????????????????????//自動(dòng)裝箱
????????????????????????int m=1;
????????????????????????在 jdk 1.4里面如何實(shí)現(xiàn)裝箱和拆箱
????????????????????????????????????publicvoidtest1(){
????????????????????????????????????????????//裝箱
????????????????????????????????????????????Integer m = new Integer(10)景鼠;
????????????????????????????????????????????//拆箱
????????????????????????????????????????????int a = m.intValue();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? }
? ? ? ? ? ? ? ? ? ? ? ? jdk是會(huì)向下兼容
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 比如子jdk1.4里面寫的代碼仲翎,這個(gè)時(shí)候到5.0里面也可以運(yùn)行
增強(qiáng)for循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? 語法:for(遍歷出來的值:要遍歷的集合){}
? ? ? ? ? ? ? ? ? ? ? ? 使用場景: 數(shù)組:實(shí)現(xiàn)Iterable接口的集合 ? 可以使用增強(qiáng)for循環(huán)?
? ? ? ? ? ? ? ? ? ? ? ? 在集合上使用增強(qiáng)for遍歷循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? list? set? 實(shí)現(xiàn)了Iterator接口,所以可以使用增強(qiáng)for循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? map不能使用增強(qiáng)for循環(huán) 沒有實(shí)現(xiàn)Iterator接口铛漓,所以不能使用增強(qiáng)for循環(huán)
? ? ? ? ? ? ? ? ? ? ? ? 增強(qiáng)for循環(huán)出現(xiàn)的目的:為了替代迭代器
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 增強(qiáng)for底層就是迭代器實(shí)現(xiàn)的
內(nèi)容補(bǔ)充
? ? ? ? ? ? ? ? ? ? ? ?? 1.泛型擦除
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 首先泛型只是出現(xiàn)在源代碼階段溯香,當(dāng)編譯之后泛型不存在了
? ? ? ? ? ? ? ? ? ? ? ? 2.練習(xí):實(shí)現(xiàn)一個(gè)泛型方法,接受任意類型的數(shù)組浓恶,顛倒數(shù)組中的所有元素
????????????????????????????????????public static <T> voidreverse(T[] arr1){
????????????????????????????????????????for(int i=0;i<arr1.length/2;i++){
????????????????????????????????????????T temp =arr1[i];
????????????????????????????????????????arr1[i]=arr1[arr1.length-i-1];
????????????????????????????????????????arr1[arr1.length-i-1]=temp;
????????????????????????????????????????????}
????????????????????????????????????????????????}
可變參數(shù)
? ? ? ? ? ? ? ? ? ?? 可變參數(shù)可以應(yīng)用在什么場景:
? ? ? ? ? ? ? ? ? ? ? ? ?? 實(shí)現(xiàn)兩個(gè)數(shù)的相加玫坛,實(shí)現(xiàn)三個(gè)數(shù)的相加, 四個(gè)數(shù)的相加 ??
? ? ? ? ? ? ? ? ? ? ? 如果實(shí)現(xiàn)多個(gè)方法包晰,這些方法里面邏輯基本相同湿镀,唯一不同的是傳遞的參數(shù)個(gè)數(shù),這時(shí)候可以使用可變參數(shù)
? ? ? ? ? ? ? ? ? ? 可變參數(shù)的定義方法 ? 數(shù)據(jù)類型...數(shù)組的名稱
? ? ? ? ? ? ? ? ? ? 理解為一個(gè)數(shù)組伐憾,這個(gè)數(shù)組存儲(chǔ)傳遞過來的參數(shù)
????????????????????????????public? static? void ?? add1(int...nums){
????????????????????????????????????????????int sum=0;
????????????????????????????????????????????for(int i=0;i<nums.length;i++){
????????????????????????????????????????sum+=nums[i];
????????????????????????????????????????????????????}
????????????????????????????????????????????System.out.print(sum);
????????????????????????????????????????}
????????????????????????????????publicstaticvoidmain(String[] args){
????????????????????????????????add1(10,20);
????????????????????????????????add1(10,20,30);
????????????????????????????????add1(10,20,30,40);
????????????????????????????????????}
????????????????????????????public ? static ?? void ? ? add1(int...nums){
????????????????????????????????int sum=0;
????????????????????????????????for(int i=0;i<nums.length;i++){
????????????????????????????????????sum+=nums[i];
????????????????????????????????????????}
????????????????????????????????????????System.out.print(sum);
??????????????????????????????????????}
????????????????????????????????public static? void ? main(String[] args){
????????????????????????????????????add1(10,20);
????????????????????????????????????add1(10,20,30);
????????????????????????????????????add1(10,20,30,40);
????????????????????????????????????????}
? ? ? ? ? ? ? ? ? ? 注意的地方 ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.可變參數(shù)需要寫在方法的參數(shù)列表中
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不能單獨(dú)定義
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.在方法的參數(shù)列表中只能有一個(gè)可變參數(shù)
? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.方法的參數(shù)列表中的可變參數(shù)勉痴,必須放在參數(shù)最后
反射的原理
? ? ? ? ? ? ? ? ? ?? 應(yīng)用在一些通用性比較高的代碼中
? ? ? ? ? ? ? ? ? ? 后面學(xué)到的框架 ?? ,大多數(shù)都是使用反射來實(shí)現(xiàn)的
? ? ? ? ? ? ? ? ? ? 在框架開發(fā)中塞耕,都是基于配置文件開發(fā)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 在配置文件中配置了類蚀腿,可以通過反射得到的類中的所有內(nèi)容,可以讓類中的某個(gè)方法來執(zhí)行
? ? ? ? ? ? ? ? ? ? 類中的所有內(nèi)容: 屬性扫外,沒有數(shù)的構(gòu)造方法莉钙,有參數(shù)的構(gòu)造方法,普通方法
? ? ? ? ? ? ? ? ? ? 反射的原理
????????????????????????????1.首先需要 java 文件保存到本地硬盤 .java
????????????????????????????2.編譯java 文件筛谚,成 .class文件
????????????????????????????3.使用 jvm 磁玉,把 class 文件通過類加載加載到內(nèi)存中
????????????????????????????4.萬事萬物皆是對(duì)象,class 文件在內(nèi)存中使用 class 類表示
????????????????????????????5.當(dāng)使用反射的時(shí)候驾讲,首先需要獲取到class 類蚊伞,得到了這個(gè)類之后,就可以得到 class 文件里面的所有內(nèi)容——包含屬性吮铭,構(gòu)造方法时迫,普通方法
????????????????????????????6.屬性通過一個(gè)類 Filed
????????????????????????????7.構(gòu)造方法通過一個(gè)類 constructor
????????????????????????????8.普通方法通過一個(gè)類 Method
使用反射操作類里面的屬性
? ? ? ? ? ? ? ? ? ? ? ? 首先獲取到Class類
???????????????????????? Class clazz1=person.class;
???????????????????????? Class clazz2=new person().getClass();
???????????????????????? Class clazz3=Class.forName("day06.person");
? ? ? ? ? ? ? ? ? ? ? ? 操作無參數(shù)的構(gòu)造方法
????????????????????????????????????public void? test1() ? ?? throws ? Exception{
??????????????????????????????????????? //得到 class ?
????????????????????????????????????? Class c3=Class.forName("cn.itcast.test09.Person");
????????????????????????????????????????//得到 person 實(shí)例 ? ? ?
????????????????????????????????????? person p=(person)c3.newInstance();
??????????????????????????????????????? //設(shè)置值 ? ?
??????????????????????????????????????? p.setName("zhangsan");
????????????????????????????????????????System.out.println(p.getName());
??????????????????????????????????????????? }
使用反射操作有參數(shù)的構(gòu)造方法
????????????????????????public ? void ? ?? test2() ? throws ?ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
????????????????????????Class c1=Class.forName("cn.itcast.test09.Person");
??????????????????????? //傳遞有參數(shù)的構(gòu)造方法里面的參數(shù)類型,類型使用 class 形式傳遞 ? ? ? ?
????????????????????????Constructor? cs=c1.getConstructor(String.class,String.class);
??????????????????????? //通過有參數(shù)的構(gòu)造方法設(shè)置值?
? ? ? ? ? ? ? ? ? ? ? ? //通過有參數(shù)的構(gòu)造方法創(chuàng)建Person實(shí)例
????????????????????????? person p1=(person) cs.newInstance("lisi","100");
? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(p1.getId()+" "+p1.getName());
? ? }
使用反射操作屬性
????????????????????public ?? void ? ? test3() ?? throws ?ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
????????????????? try {
? ? ? ? ? ? ? ? ? ?? Class cc=Class.forName("day06.person");
? ? ? ? ? ? ? ? ? ? ?? //得到 person 類的實(shí)例 ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? Person p11=(Person)? c2.newInstance();
???????????????????????? //通過這個(gè)方法得到屬性谓晌,參數(shù)是屬性的名稱
?????????????????????????Field f1=cc.getDeclaredField("name");
????????????????????????//操作的是私有屬性掠拳,不讓操作,需要設(shè)置可以操作私有屬性setAccessible(true)
?????????????????????????f1.setAccessible(true);
????????????????????????//設(shè)置name的值 ?
????????????????????????? f1.set(p , "wangwu");//相當(dāng)于 p.name="wangwu" ? ? ? ?
????????????????????????}catch(Exception e) {
??????????????????????????? e.printStackTrace();
????????????????????}
??????????????????? }
使用泛型操作普通方法
????????????????????使用 Method 類表示普通方法
???????????????????? public ?? void ? ? test4() ? ? ? throws ? ? ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
????????????????????Class c4=Class.forName("day06.person");
??????????????????? / /得到 person 實(shí)例 ? ? ??
?????????????????person p4=(person) c4.newInstance();
??????????????????? //得到普通方法 ??
?????????????????//傳遞兩個(gè)參數(shù)纸肉,第一個(gè)參數(shù):方法名稱第二個(gè)參數(shù):通過方法設(shè)置的值 ? ? ? ?
????????????????????Method? m1=c4.getDeclaredMethod("setname", String.class);
??????????????????? //讓 setName方法執(zhí)行溺欧,執(zhí)行設(shè)置值 ? ?
??????????????????????? m1.invoke(p4, "niuqi");
?????????????????????? System.out.println(p4.getName());
? ? }
? ? ? ? ? ? ? ? 操作的私有的方法,需要設(shè)置值是true
? ? ? ? ? ? ? ? 當(dāng)操作的方法是靜態(tài)的方法時(shí)候柏肪,因?yàn)殪o態(tài)方法調(diào)用方式是 ?? 類名.方法名 ? 不需要類的實(shí)例
? ? ? ? ? ? ? ? 使用反射操作靜態(tài)方式時(shí)候姐刁,也不需要實(shí)例
? ? ? ? ? ? ? ? 在invokie方法的第一個(gè)參數(shù)里面 ,寫一個(gè)? null
????????????
????????
????????????????????????
????????????????????
????????????????????
????????????????????????????
????????????????????????????
????????????????????
????????????