黑马程序员-泛型

来源:互联网 发布:saas源码 java 编辑:程序博客网 时间:2024/06/06 20:05

---------------------- android培训、java培训、期待与您交流! ----------------------

可变参数:重载和重写的区别:重写不能缩小访问权限,不能抛出新的异常。

       a)    ...位于变量类型和变量名之间前后有无空格都可以

       b)    注意:可变参数一定要定义在参数列表的最后面。

       c)    其实是数组参数的一种简写形式。不用每次传参数时手动new一个数组了。只要将要操作的元素作为参数传递即可,隐式的将这些参数封装成了数组。

oreach输出

       格式:for(数据类型变量名:被遍历的集合或数组变量)

       对集合进行遍历:

              只能对集合进行遍历,不能对集合进行操作

              迭代除了遍历,还可以remove集合中的元素

              如果是ListIterator,还可以在遍历过程中对集合进行增删改查

       传统for和高级for的区别:

              高级for有一个局限性,必须有被遍历的目标

              传统for循环可以定义角标。

静态导入 import static

泛型:

        用于解决安全问题,是一个安全机制。提供给java编译器使用。可以限定输入的类型,让编译器挡住非法的类型的输入,编译器编译带类型的集合时会去除掉“类型”信息,使程序的运行效率不受影响。对于参数化的泛型类型,.getClass()方法的返回值和原始类型完全一样,只要跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如:用反射得到集合,再调用其add()方法即可。

      好处:将运行时期出现的问题,转移到了编译时期,方便问题解决。

                 避免了强制转换操作。

      规则:

        1、参数化类型与原始类型兼容

               参数化类型可以引用一个原始化类型的对象,编译报警告,如:

                     Collectioncoll<String> = new ArrayList();

               原始类型可以引用一个参数化类型的对象,编译报警告,如:

                     Collection coll = newArrayList<String>();

         2、参数化类型不考虑类型参数的继承:即当左右两边都有泛型时,要一致。

                     ArrayList<String> arr= new ArrayList<Object>();

                     ArrayList<Object> arr= new ArrayList<String>();

         3、在创建数组实例时,数组元素不能使用参数化的类型,如:

           ArrayList<String> arrlist[] =new ArrayList<String>();

         4<T>其中的泛型参数不能是基本数据类型,只能是引用数据类型。

         5、定义多个泛型参数时,参数之间用“,”隔开。

         6、用类型变量表示异常,称为参数化的异常,可用于方法的throws列表中,但不能用于catch子句中。只能catch具体某个异常,我们可以将捕获的异常封装为参数化的异常然后throw

      通配符:“?”可以匹配任意类型

        1、限定泛型上限:<? extends Number>只能是Number或其子类

        2、限定泛型下限:<String super ?>只能是StringString的父类

       a)   泛型类:

定义在类上的泛型,当类中的要操作的引用数据类型不确定时使用。代替Object完成扩展,泛型类在new对象时指定泛型类型。类上的泛型不能使用于静态方法上,静态方法要使用泛型需要自定义,不受泛型类的类型限制。

不同方法操作的是同一类型:如dao类中

       b)  泛型方法:

                    定义在方法上的泛型,类中的不同方法可操作不同类型的。

                    格式:泛型<T>放在返回值之前。

                     如:public static <T> void swap(T[] t ,int x,int y){}

       c)   静态泛型方法

                    静态泛型方法不能访问定义在类上的泛型(类在new对象时才指定泛型类型)

      通过反射获得泛型的参数化类型:

              直接获得泛型的参数化类型是不行的,但是可以将要获取的带泛型的类型作为函数的参数,通过反射获得该函数对应的Method对象,然后再获德该对象的泛型参数类型数组Type[]。在将数组中的元素强转为ParameteriedType类型,再通过该类的实例获得原始类型和参数化类型。

练习1:

package org.cc.fanxin;
//自定义泛型方法
class FanxinMethod {
 public <T> void show(T t) {
  System.out.println(t);
 }
 public static <W> void sop(W w) {//静态方法不能访问类上的泛型
  System.out.println(w);
 }
}
public class FanxinMethodDemo {
 public static void main(String[] args) {
  FanxinMethod fx = new FanxinMethod();
  fx.show("show sfdsf");
  fx.show(34);
  FanxinMethod.sop(34);
 }

}

练习2:

package org.cc.fanxin;
//自定义泛型类
class FanxinClass<T> {
 public void show(T t) {//在方法上使用定义在类上的泛型类型
  System.out.println(t);
 }
 public void sop(T t) {
  System.out.println(t);
 }
}
public class FanxinClassDemo {
 public static void main(String[] args) {
  FanxinClass<String> fx = new FanxinClass<String>();
  fx.show("chenchao");
  fx.sop("sop");
 }
}

---------------------- android培训、java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

原创粉丝点击