---------------------- android培训、java培训、期待与您交流! ----------------------
一:注解
1:注解
注解就是告诉编译器在变异那些代码时,该怎么特别对待!
没一个注解都是一个类,我们用每个注解就相当于创建了某个注解类的对象,注解相当于一种标记
注解可以加在包,类,字段,方法,方法的参数以及局部变量上
2:@SuppressWarnings("deprecation") 可以在使用过时方法,编译时不会提示注意(对开发工具编译器无效,只是在使用javac编译时)
3:@Deprecated 当某个类中的某个方法已经不需要时,但是却不想删除时,可以用这个注解来讲这个方法标明过时
4:@Override 编译时会如果没有成功覆盖父类会报错
(2,3,4是javajdk提供的最基本三个注解,在java.lang包中可以找到)
5:注解类的写法
注解类用@interface定义
例:public @interface A{
}
6:注解相对应用的三部关系
注解类-->应用了"注解类"的类-->对"应用了注解类的类"进行反射操作的类
7:一个类的字节码的isAnnotationPresent(某个注解的字节码) 可以判断这个类是否使用了该注解标记过
一个类的字节码的getAnnotation(某个注解的字节码) 可以获取某个类的标记的这个注解对象,但是要进行类型转换才可以获得该注解
对象
8:元注解
我们可以为注解增加注解来设定这些注解的一些特定能力,这种注解称为元注解
@Retention(RetentionPolicy.RUNTIME) 设定注解会在所标记类运行时保留
@Retention 标明注解的生命周期,有三种形式:
@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
分别对应了:java源文件-->class文件-->内存中的字节码
内存中的字节码是类加载器将class文件经过一系列处理加载到内存中最终形成的二进制文件
默认生命周期是在class阶段
@Target(ElementType.METHOD)
标明他标记的注解只能在方法上使用
@Target({ElementType.METHOD,ElementType.TYPE})
这个元注解中的参数也可以定义多个,标明使用范围,用大括号定义数组,在大括号中以","号分隔表明不同范围
9:注解属性
初级属性(1): 抽象方法 使用注解的时候传入对应的属性等于什么,但有些属性可以省略等号以前直接输入值(例:value),但只有在传入参数只有这一个参数时,才可以这样,但是有时注解中不止一个参数,我们可以为其他参数设置缺省值(default)
例:在一个注解中的属性
String color() default "blue"
String value();
这是我们在使用这个注解时就可以直接传入value的值了
高级属性(2):注解中每个属性后面都要加() 来表示接收属性
注解中的数组:在使用注解时,如果使用它的数组属性,并且它的数组属性中的元素只设置为个,那么可以不加大括号
例:int[] arr() default {1,2,3}
注解中的枚举:枚举的缺省值只能是它的实例对象
注解中的注解:注解的缺省值是注解的实例对象,并且必须将无法省略的属性填写
二:泛型
1:泛型略解
在jdk1.5中也可以按原来的方式将不同类型的数据存入集合,但是编译器会报uncheck警告
泛型是让编译器编译是挡住除限定类型外的非法输入,编译器编译完成后回去掉"类型"信息,使程序运行不受影响 所以在想为一个泛型集合加入一个非泛型元素时可以用反射跳过编译阶段获取集合,然后用add方法添加(这种方式叫做去类型化)
2:泛型中的术语
整个ArrayList<E>称为泛型类型
ArrayList<E>中的E称为类型变量或类型参数
整个ArrayList<Integer>称为参数化类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList<Integer>中的<> 发因为tyoeof
ArrayList称为原始类型
3:参数化类型与原始类型的兼容
参数化类型可以引用原始类型的对象,同样,原始类型也可以引用参数化类型的对象,只是会报警告
4:注意泛型类型
参数化类型不考虑类型参数的继承关系
在创建数组实例时,数组的元素不能使用参数化类型泛型,因为数组本就是指定存放类型的
5:泛型中的?通配符
?代表任意类型
当我们建立一个方法,想向其中传入任意类型集合,就需要将泛型类型定义为?,表示任意类型都可以传入,但是这个方法内,不能使用任何集合与泛型类型有关的方法,否则会报错
6:泛型中的?通配符的扩展
限定通配符的上边界
? extends Number
反省包括Number和Number的子类
? super Number
反省包括Number和Number的父类
7:自定义泛型方法及其应用
泛型需要放在返回值前
8:如果一个方法中的有多个参数是泛型类型的,那么这个泛型的类型就是它们的最大公约数
9:泛型的实际类型只能是引用数据类型,不能是基本数据类型,但是系统可以自动装箱,但是基本数据类型对象会报错了
10:定义泛型的时候也可以用extends 限定符定义,还可以用&来增加泛型范围
11:普通方法,静态方法,构造方法都可以使用泛型
12:也可以表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch语句中
13:使用泛型类型定义的方法,想向其中传入任意类型集合,可以使用这个集合与泛型类型有关的方法
14:自定义泛型类
如果想让类中的所有方法实行按一个泛型,就可以在类身上定义泛型
但是静态属性不可以用类泛型,需要自己定义泛型
15:通过反射获得泛型的实际类型参数
我们无法通过一个对象获得它的泛型,我们需要将这个对象传入一个方法作为参数,然后用Method类的GetGenericParameterTypes()方法获得方法的参数类型,还有其他方法可以获得异常等的参数类型,用一个Type数组接收,然后创建Type的子类ParameterizedType(参数化的类型)的对象来获取Type中的每一个元素,然后用ParameterizedType的getRawType()方法或得到它的原始类型,
ParameterizedType的getActualTypeArguments()[]方法可以打印他的实际化参数类型,因为参数类型可能有多个,所以用[]来表示打印的坐标
16:两个只有参数中泛型不同的方法是不合法的,不能构成重载
---------------------- android培训、java培训、期待与您交流! ----------------------