泛型
为什么要有泛型 Generic ?
-
泛型:jdk1.5新加入的,解决数据类型的安全性问题,其问题主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体类型即可。
-
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁,健壮。
-
java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
泛型的使用
泛型类
- 对象实例化时不指定泛型。默认为:Object
- 泛型不同的引用不能相互赋值
泛型接口
IB接口
B1
B2
main
泛型方法
- 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
通配符
- 不确定集合中元素具体的数据类型,使用 ? 表示所有类型
有限制的通配符
- 例如:
<? extends Person > ( 无穷小,Person 】
只允许泛型为Person即Person子类的引用调用
<? super Person > [Person,无穷大)
只允许泛型为Person及Person父类的引用调用
<? extends Comparable>
只允许泛型为实现Comparable接口的实现类的引用调用
枚举与注解
枚举
-
在某些情况下,一个类的对象是有限而且固定的。例如季节类,只能有4个对象
-
手动实现枚举类:
- private 修饰构造器
- 属性使用 private final 修饰
- 把该类的所有实例都使用 public static final 来修饰
使用 enum 定义枚举类
- JDK 1.5 新增的 enum 关键字用于定义枚举类
- 枚举类和普通类的区别:
- 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
- 枚举类的构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显示列出( . 分隔 ;结尾 )列出的实例系统会自动添加 public static final 修饰
- 所有的枚举类都提供了一个 values 方法。该方法可以很方便地遍历所有的枚举值
- JDK 1.5 中可以在 switch 表达式中使用枚举类的对象作为表达式。 case 子句可以直接使用枚举类值的名字,无需添加枚举类作为限定
- 若枚举只有一个成员,则可以作为一种单子模式的实现方式
实现接口的枚举类
- 和普通 java 类一样枚举类可以实现一个或多个接口
- 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法
枚举类的方法
注解(Annotation)
- 从JDK 5.0 开始,Java增加了对元数据(MataData)的支持,也就是 Annotation(注解)
- Annotation 其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理,通过使用 Annotation 程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息
- Annotation 可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在 Annotation 的 “name=value"对中
- Annotation 能被用来为程序元素(类,方法,成员变量等)设置元数据
基本的 Annotation
- 使用 Annotation 时要在其前面增加 @ 符号,并把该 Annotation 当成一个修饰符使用,用于修饰它支持的程序元素
- 三个基本的Annotaion:
- @Override :限定重写父类方法,该注释只能用于方法
- @Deprecated :用于表示某个程序元素(类,方法等)已过时
- @SuppressWarnings :抑制编译器警告
自定义 Annotation
- 定义新的 Annotation 类型使用 @interface 关键字
- Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明,其方法和返回值定义了该成员的名字和类型
- 可以在定义 Annotation 的成员变量时为其指定初始值,指定成员变量的初始值可使用 default 关键字
- 没有成员定义的 Annotation 称为标记,包含成员变量的 Annotation 称为元数据 Annotation
注解这部分内容,作为了解,未来如果能做一些底层开发或者开源项目之类中会使用到