一:JDK1.5注解
1:什么是注解
注解是一个类。注解相当于一个你的源程序要调用的一个类,在源程序中应用某个注解,得先准备好某个注解类,就像你要调用某个类,得先开发好这个类。
注解相当于一种标记,加了注解就等于打上某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记看你有什么标记,就去干相应的事,标记可以加在包、类、字段、方法、方法的参数以及局部变量上。
java.lang包下,可看到JDK中提供的最基本的annotation
Annotation Types 注解类型
Deprecated 标识下面的代码过时了
Override 标识下面代码是对父类代码的重写
SupperWarnings 知道下面的代码已经过时,希望编译器忽略过时警告
2: 写注解类
注解的生命周期:注解的生命周期有三个阶段:java源文件阶段-àclass文件阶段-----.>内存中的字节码阶段。分别对应着@Retention元注解的三种取值:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME。默认情况下是RetentionPolicy.CLASS阶段。
例如:
//注解生命周期说明,默认为RetentionPolity.CLASS阶段
@Retention(RetentionPolicy.RUNTIME)
Public @interface 注解名{
}
@Override 注解的生命周期为java源文件阶段,即RetentionPolicy.SOURCE
@SupperssWarnings注解的生命周期为java源文件阶段,即RetentionPolicy.SOURCE
@Deprecated注解的生命周期为运行阶段,即RetentionPolicy. RUNTIME
@Target此元注解指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。它的值为ElementType[] value 类型的数组。
public enum ElementType extends Enum<ElementType>程序元素类型。此枚举类型的常量提供了 Java 程序中声明的元素的简单分类。这些常量与Target 元注释类型一起使用,以指定在什么情况下使用注释类型是合法的。
二:泛型
1:什么是泛型
泛型是jdk1.5的所有新特性中最难深入掌握的部分,不够我们在实际应用不能掌握的那么深,掌握泛型的一些基本的内容就差不多了。没有使用泛型前,只要是对象,不管是什么类型的对象,都可以存储进同一个集合。使用泛型集合,可以将一个集合中的元素限定为一个特有的类型,集合中只能存储同一个类型的对象,这样更安全,并且当从集合中获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换,这样更方便。在JDK1.5中,你还可以按原来的方式将各种不同类型的数据装到一个集合中,但编译器会报告unchecked警告。
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序的运行效率不受影响,对于参数化的泛型类型,getclass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如,用反射得到集合,再调用其add方法即可。
ArrayList<E>类定义和ArrayList<Integer>类引用中涉及到的术语:
整个ArrayList<E>称为泛型类型。ArrayList<E>中的E称为类型变量或者类型参数。整个ArrayList<Integer>称为参数化的类型。ArrayList<Integer>中的Integer称为类型参数的实例或者实际类型参数。ArrayList<Integer>中的<>念做typeof。ArrayList称为原始类型。
a :参数化类型与原始类型的兼容性:
a: 参数化类型可以引用一个原始类型的对象,编译报告警告,例如:
Collection<String> c = new Vector();
b: 原始类型可以引用一个参数化的类型对象,编译报告警告,例如
Collection c = new Vector<String>();
b:参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>();/错误!
Vector<Object> v=new Vector<String>();//也是错误
c:在类型参数相同的情况下,原始类型可以考虑继承关系
Collection<String> c1 = new Vector<String>();
d:在创建数组实例时,数组的元素不能使用参数化的类型
Vector<String> vectorList[] = new Vector<String>[10];
e:下面的代码不会报错,因为javac是一行一行进行扫描的
Vector v1 = new Vector<String>();
Vector<Object> v = v1;
2:泛型的通配符及扩展
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不可以调用与参数化有关的方法。
限定通配符的上边界(继承关系中的):
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
限定通配符的下边界(继承关系中的):
正确:Vector<? super Integer> x = new Vector<number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
提示:限定通配符总是包含自己
3:类型参数的类型推断:
编译器判断泛型方法的实际类型复杂的过程称为类型推断,类型推断是相对于知觉推断的,其实现方法是一个非常复杂的过程。
根据调用泛型方法时实际传递的参数类型或返回值的类型来推断,具体规则如下:
a:当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时该处的实际应用类型来确定,这很容易凭感觉推断出来,即直接根据调用方法时传递的参数类型,或返回值来决定泛型参数的类型,例如:
Swap(new String[3],3,4)----àstatic <E> void swap(E[] a, int i, int j )
b: 当某个类型变量在整个参数列表中的所有参数和返回值中被多次应用了,如果调用方法时,这多处的实际应用类型都对应同一种类型来确定,这很容易凭着感觉推断出来,例如
add(3,5)----------------------------àstatic <T> T add(T a, T b)
b: 当某个类型变量在整个参数列表中的所有参数和返回值中被多次应用了,如果调用方法时,这多处实际应用类型对应到了不同的类型,且没有使用返回值,这个时候取多个参数的最大交集类型,例如下面的语句实际对应的类型就是Number了,编译没问题,执行有问题
fill(new Integer[3] ,3.5f)-----------------àstatic <T> void fill(T[] a, T v);
d: 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时,这多处实际应用类型对应到了不同的类型,并且使用返回值,这时应该优先考虑返回值类型。例如,下面语句实际对应的类型就是Integer了,编译将报错,将变量x的类型改为float,对此eclipse报告的错误提示,接着再将变量x类型改成number,则没有错误了
Int x = add(3, 3.5) —————>static <T> T add(T a, T b)
e: 参数类型的类型推断具有传递性,下面第一种情况推断实际参数为Object,编译没有问题,而第二种情况则根据参数化的Vector类实例将类型变量直接确定为String类型,编译将出现问题:
Copy(new Integer[5] ,new String[5])-----------------àstatic <T> void copy (T[] a, T[] b);
Copy1(new Vector<Date> () , new String[10])---------à static <T> void copy (collection<T> a, T[] b);
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima