JavaWeb day7

泛型的简介

            为什么要使用泛型

                        一般使用在集合上

                            比如现在把一个字符串类型的值放入到集合里面,这个时候,这个值放入到集合之后,失去本来类型,只能是 object 类型,这个时候,比如想要对这个值进行类型转换,很容易出现类型转换错误,怎么解决这个问题,可以使用泛型类来解决。

               在集合上如何使用泛型

                            常用集合 list  set  map

                             泛型语法   集合<String>   比如List<String>

                在泛型里面写是一个对象,String 不能写基本的数据类型  比如 int

                                写基本的数据类型对应包装类

                                            byte —— Byte

                                            short    ——      Short

                                            int        ——      Integer

                                            long      ——      Long

                                            float        ——      Float

                                            double    ——      Double

                                            char      ——        Character

                                            boolean    ——    Boolean

                    在list上面使用泛型

                              list的三种实现   ArrayList  LinkedList  Vetor

                            List <String> list=new ArrayList<String>();

                                        list.add("aaa") ;

                                        list.add("bbb") ;

                                         list.add("ccc") ;

                                        //遍历list

                                    //普通 for 循环

                                    for(int i=0;i<list.size();i++){

                                                String s=list.get(i);

                                                System.out.print(s);

                                }

                                        //使用增强 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结构:key-value形式

泛型使用在方法上

                定义一个数组,实现指定位置上数组元素的交换

                方法逻辑相同, 只是数据类型不同,这个时候使用泛型方法

                            使用泛型方法 需要定义一个类型 使用大写字母表示  T:这个T表示任意的类型

                            写在返回值之前   void之前<T>

泛型在类上的使用

                 在一个类上定义一个类型,这个类型可以在类里面直接使用

                public class  TestDemo04<T>{

                    //在类里面可以直接使用T的类型

                    T  aa;

                    }      

                  public void test11(T bb){}

                    //写一个静态方法 在类上面定义的泛型  不能再静态方法里面使用

                    public  static< A> void test12(A  cc  ){

            }

枚举的简介

                什么是枚举

                            需要在一定的范围内取值,这个值只能是这个范围内中的任意一个

                使用一个关键字enum

                             enum Color3{

                              RED,GREEN,YELLOW

                            }

                    枚举的构建方法是私有的

                    特殊枚举的操作

                                在枚举类里面有构造方法

                                                构造方法里面有参数,需要在每个实例上面都写参数

                                在枚举类里有抽象方法

                                                在枚举的每个实例里面都重写这个抽象方法

枚举的api的操作

                        name():返回枚举的名称

                        ordinal():枚举的下标,下标是从0开始

                        ValueOf(Class<T>  enumType,String name):得到枚举的对象

                        还有两个方法,都是这两个方法不在api里面,编译的时候生成两个方法

                                    ValueOf(String name)    转换枚举对象

                                    Values()   获得所有枚举对象数组

                    知道枚举的对象,得到枚举名称和下标

                    @Test

                    public void  test1(){

                                //得到枚举对象

                                Color100 c100=Color100.RED;    

                                //枚举名称

                                String name=c100.name();

                                //枚举的下标

                                int idx=c100.ordinal();

                                System.out.println(name+"  "+idx);

                                 }

                        知道枚举名称,得到枚举对象和下标

                                publicvoidtest(){

                                String  name1="GREEN";

                                color  c1=color.valueOf(name1);

                                //得到枚举对象

                                int idx=c1.ordinal(); //得到枚举下标

                                }enumcolor(

                                RED,GREEN,YELLOW

                                    )

                        知道枚举下标,得到枚举对象和名称

                            public void  test(){

                                int idx2=2;

                                color[]  cs=color.values();//得到枚举对象数组

                                color  c2=cs[idx2];  //根据下标得到对象

                            String  name=c2.name(); //根据对象得到名称

                            }enumcolor(

                                RED,GREEN,YELLOW

                                 )

静态导入     

                        可以在代码里面,直接使用静态导入方式,导入静态方法或者常量

                        import   static     XX.XX.xxx

自动拆装箱

                        装箱:把基本的数据类型转换成包装类

                        拆箱:把包装类转换成基本的数据类型

                        //自动装箱

                        Integer i=10;

                        //自动装箱

                        int m=1;

                        在 jdk 1.4里面如何实现装箱和拆箱

                                    publicvoidtest1(){

                                            //装箱

                                            Integer m = new Integer(10);

                                            //拆箱

                                            int a = m.intValue();

                                             }

                        jdk是会向下兼容

                                        比如子jdk1.4里面写的代码,这个时候到5.0里面也可以运行

增强for循环

                        语法:for(遍历出来的值:要遍历的集合){}

                        使用场景: 数组:实现Iterable接口的集合   可以使用增强for循环 

                        在集合上使用增强for遍历循环

                                    list  set  实现了Iterator接口,所以可以使用增强for循环

                                    map不能使用增强for循环 没有实现Iterator接口,所以不能使用增强for循环

                        增强for循环出现的目的:为了替代迭代器

                                            增强for底层就是迭代器实现的

内容补充

                         1.泛型擦除

                                    首先泛型只是出现在源代码阶段,当编译之后泛型不存在了

                        2.练习:实现一个泛型方法,接受任意类型的数组,颠倒数组中的所有元素

                                    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;

                                            }

                                                }

可变参数

                     可变参数可以应用在什么场景:

                           实现两个数的相加,实现三个数的相加, 四个数的相加   

                      如果实现多个方法,这些方法里面逻辑基本相同,唯一不同的是传递的参数个数,这时候可以使用可变参数

                    可变参数的定义方法   数据类型...数组的名称

                    理解为一个数组,这个数组存储传递过来的参数

                            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.可变参数需要写在方法的参数列表中

                                        不能单独定义

                            2.在方法的参数列表中只能有一个可变参数

                            3.方法的参数列表中的可变参数,必须放在参数最后

反射的原理

                     应用在一些通用性比较高的代码中

                    后面学到的框架    ,大多数都是使用反射来实现的

                    在框架开发中,都是基于配置文件开发

                               在配置文件中配置了类,可以通过反射得到的类中的所有内容,可以让类中的某个方法来执行

                    类中的所有内容: 属性,没有数的构造方法,有参数的构造方法,普通方法

                    反射的原理

                            1.首先需要 java 文件保存到本地硬盘 .java

                            2.编译java 文件,成 .class文件

                            3.使用 jvm ,把 class 文件通过类加载加载到内存中

                            4.万事万物皆是对象,class 文件在内存中使用 class 类表示

                            5.当使用反射的时候,首先需要获取到class 类,得到了这个类之后,就可以得到 class 文件里面的所有内容——包含属性,构造方法,普通方法

                            6.属性通过一个类 Filed

                            7.构造方法通过一个类 constructor

                            8.普通方法通过一个类 Method

使用反射操作类里面的属性

                        首先获取到Class类

                         Class clazz1=person.class;

                         Class clazz2=new person().getClass();

                         Class clazz3=Class.forName("day06.person");

                        操作无参数的构造方法

                                    public void  test1()      throws   Exception{

                                        //得到 class  

                                      Class c3=Class.forName("cn.itcast.test09.Person");

                                        //得到 person 实例      

                                      person p=(person)c3.newInstance();

                                        //设置值    

                                        p.setName("zhangsan");

                                        System.out.println(p.getName());

                                            }

使用反射操作有参数的构造方法

                        public   void      test2()   throws  ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{


                        Class c1=Class.forName("cn.itcast.test09.Person");

                        //传递有参数的构造方法里面的参数类型,类型使用 class 形式传递        

                        Constructor  cs=c1.getConstructor(String.class,String.class);

                        //通过有参数的构造方法设置值 

                        //通过有参数的构造方法创建Person实例

                          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 类的实例       

                        Person p11=(Person)  c2.newInstance();

                         //通过这个方法得到属性,参数是属性的名称

                         Field f1=cc.getDeclaredField("name");

                        //操作的是私有属性,不让操作,需要设置可以操作私有属性setAccessible(true)

                         f1.setAccessible(true);

                        //设置name的值  

                          f1.set(p , "wangwu");//相当于 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 实例       

                 person p4=(person) c4.newInstance();

                    //得到普通方法   

                 //传递两个参数,第一个参数:方法名称第二个参数:通过方法设置的值        

                    Method  m1=c4.getDeclaredMethod("setname", String.class);

                    //让 setName方法执行,执行设置值    

                        m1.invoke(p4, "niuqi");

                       System.out.println(p4.getName());

    }

                操作的私有的方法,需要设置值是true

                当操作的方法是静态的方法时候,因为静态方法调用方式是    类名.方法名   不需要类的实例

                使用反射操作静态方式时候,也不需要实例

                在invokie方法的第一个参数里面 ,写一个  null

            

        

                        

                    

                    

                            

                            

                    

            

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容