Java基础-学习笔记11
11 枚举、注解
枚举
枚举是一组常量的集合。
可以这么理解:枚举属于一种特殊的类,里面只包含一组有限的特定的对象。比如,Season类,只包含SPRING、SUMMER、AUTUMN、WINTER四个对象常量。
两种实现方式
(1)自定义类实现枚举
1) 构造器私有化
2) 本类内部创建一组对象 [四个 春夏秋冬]
3) 对外暴露对象(通过为对象添加 public final static 修饰符)
4) 可以提供 get方法,但不要提供 set
//main:
System.out.println(Season.AUTUMN.getName());
System.out.println(Season.SPRING.getDesrip());
class Season
{
private String name;
private String desrip;
private Season(String name, String desrip)
{
this.name = name;
this.desrip = desrip;
}
public static final Season SPRING = new Season("Spring", "warm");
public static final Season SUMMER = new Season("Summer", "hot");
public static final Season AUTUMN = new Season("Autumn", "cool");
public static final Season WINTER = new Season("Winter", "cold");
public String getName()
{
return name;
}
public String getDesrip()
{
return desrip;
}
}
(2)enum 关键字实现枚举
- 使用 enum 代替 class
- 使用 enum 来实现枚举,要求将定义的常量对象写在前面
- 如果有多个常量对象,用,(逗号)间隔即可,最后用;(分号)结尾
- 直接使用 常量名(构造器实参列表) 就可创建常量对象
- 如果使用的是无参构造器创建常量对象,则可以忽略小括号和实参列表
- 当我们使用 enum 来实现枚举时,默认会继承 Enum类(可通过 javap 反编译查看)
//main:
System.out.println(Season.AUTUMN.getName());
System.out.println(Season.SPRING.getDesrip());
enum Season
{
SPRING("Spring", "warm"),SUMMER("Summer", "warm"),AUTUMN("Autumn", "cool"),WINTER("Winter", "cold");
private String name;
private String desrip;
private Season(String name, String desrip)
{
this.name = name;
this.desrip = desrip;
}
public String getName()
{
return name;
}
public String getDesrip()
{
return desrip;
}
}
enum 常用方法
枚举类.valueOf(名称): 返回名称对应的枚举对象,如果不存在就会报错
枚举实例.ordinal(): 返回枚举实例对应的索引号,默认从0开始
枚举类.values(): 返回当前枚举类中所有常量形成的列表
枚举实例1.compareTo(枚举实例2): 比较两个枚举常量,比较的是位置号,返回实例1的位置号-实例2的位置号
enum 使用细节
- enum 类已经隐式继承了 Enum 类了,所以不能再继承其他类了。
- enum 类和普通类一样,可以实现接口
枚举类实现switch
- switch()中,放入枚举对象
- 在每个 case 后,直接写上在枚举类中定义的枚举对象即可
COLOR green = COLOR.GREEN;
switch(green)
{
case BLUE:
System.out.println("BLUE");
break;
case RED:
System.out.println("RED");
break;
default:
System.out.println("no match...");
}
注解
1)注解(annotation)也被称为元数据(metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。
2) 相当于嵌入再代码中的补充信息。
3) 在 JavaSE,注解的使用目的比较简单,例如标记过时内容(@Deprrcated)、限定重写方法(@Override)、抑制编译器警告(@SuppressWarning); 在JaveEE中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。
4) @Target是修饰注解的注解,是元注解。
5) 写注解的价值在于,编译会自动进行语法校验。比如说,如果写了@Override注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确构成重写,则编译通过。否则编译错误。
元注解 (了解即可)
// 元注解的种类:
1)Retention // 指定注解的作用范围(时间),三种:
// SOURCE(编译器使用后直接丢弃这种策略的注解)
// CLASS (注解记录保留在class文件中,运行Java程序时,JVM不会保留注解)
// RUNTIME(注解记录保留在class文件中,运行时JVM会保留注解,程序可以通过反射获取该注解)
2)Target // 指定注解可以在那些地方使用,取值包括 类、方法、构造器...
3)Documented // 指定该注解是否在javadoc中体现
4)Inherited // 子类会自动继承父类的注解