第十九章 枚举类型
第二十章 注解
enum 枚举类
默认继承java.lang.Enum,可以实现多个接口,枚举类的构造器修饰符private,枚举类的实例在枚举类的第一行显示列出
public enum Season implements Description{
// Season的实例
SPRING("春"){
@Override
public void info() {
System.out.println("spring:春");
}
},
SUMMER("夏"){
@Override
public void info() {
System.out.println("summer:夏");
}
},
FALL("秋"){
@Override
public void info() {
System.out.println("fall:秋");
}
},
WINTER("冬"){
@Override
public void info() {
System.out.println("winter:冬");
}
};
private String alias;
private Season(String alias) {
this.alias = alias;
}
public String getAlias() {
return alias;
}
public static void main(String[] args) {
// 枚举类实例的名称
System.out.println(SPRING.name());
// 枚举值的索引值
System.out.println(SUMMER.ordinal());
// 枚举常量的名称与name方法相似
System.out.println(FALL.toString());
// 获取指定名称的枚举值
System.out.println(Season.valueOf("WINTER"));
// 获取所有枚举值
Season[] seasons = Season.values();
for (Season season : seasons) {
System.out.println(season.getAlias());
}
WINTER.info();
}
@Override
public void info() {
System.out.println("season:季节");
}
}
//output:
SPRING
1
FALL
WINTER
春
夏
秋
冬
winter:冬
注解
从JDK5开始,java增加了对元数据的支持,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。这些标志可以在编译,类加载,运行时被读取,并执行相应的处理,注解不影响代码的执行。
5个基本注解:
@Override 指定覆盖方法
@Deprecated 表示某个程序元素已过时
@SuppressWarnings 指示被该注解修饰的元素取消显示指定的编译器警告
@SafeVarargs
@FunctionalInterface 指定某个接口为函数式接口
JDK的元注解(注解的注解)
@Retention 用于指定被修饰的注解可以保留多久
@Retention(RetentionPolicy.CLASS)
注解记录在class文件中,运行程序时JVM不可获取注解信息
@Retention(RetentionPolicy.RUNTIME)
注解记录在class文件中,运行程序时JVM可以获取注解信息
@Retention(RetentionPolicy.SOURCE)
注解只记录在源代码中
@Target 用于修饰注解可应用于的程序单元
ElementType.ANNOTATION_TYPE 用于描述注解
ElementType.CONSTRUCTOR 用于描述构造器
ElementType.FIELD 用于描述域
ElementType.LOCAL_VARIABLE 用于描述局部变量
ElementType.METHOD 用于描述方法
ElementType.PACKAGE 用于描述包
ElementType.PARAMETER 用于描述参数
ElementType.TYPE 用于描述类、接口(包括注解类型) 或枚举定义
@Documented
@Documented用于指定被该元注解修饰的注解类将被 javadoc工具提取成文档
@Inherited
指明被修饰的注解具有继承性,某个类被@Xxx注解(该注解被@Inherited修饰),则其子类自动被@Xxx修饰
##############################
根据注解是否包含成员变量分为:
标记注解:无成员变量
元数据注解:包含成员变量
##############################
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Test{
// 定义名为name的成员变量,并指定默认值
public abstract String name() default "class";
}
@Test(name="main")
public class Main{
}
利用反射提取注解信息
Annotation接口代表程序元素前面的注解,AnnotatedElement接口代表程序中可以接受注解的元素
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Test {
String name() default "method";
}
public class Main {
@Test(name="info")
public void info(){}
public static void main(String[] args) throws Exception{
Annotation[] array = Main.class.getMethod("info").getAnnotations();
for (Annotation annotation:array) {
System.out.println(((Test)(annotation)).name());
}
}
}
//output:
info