JDK1.5之前需要自定义枚举类
JDK 1.5 新增的 enum 关键字用于定义枚举类
枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰
枚举类和普通类的区别:
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
枚举类的构造器只能使用 private 访问控制符
枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
1、枚举类的主要方法:
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

```
/*
*枚举是一种数据类型;
*类 是一种数据类型;
*
*如果我们需要一组常量,建议用枚举;
*
*枚举:
*星期:日,一到六;
*颜色:赤橙黄绿青蓝紫;
*四季:春夏秋冬;
*职称:正,副,
*
*用法:
*枚举名.属性名;
*/
public enum Sex {//枚举关键字:enum;
男,女;//值不加双引号,用逗号隔开,结束用分号;逗号分号都是英文的;不能用纯数字;
}
public class Person {
private String name;
private int age;
private Sex sex;//sex是Sex(枚举)类型;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
//对不合理的性别进行处理:一种赋默认值,一种异常处理;今天用枚举;
// public void setSex(String sex) {
// this.sex = sex;
// }
}
/*
*功能:性别只能输入男或女,输入别的编译报错;
*用枚举;
*
*
*/
public class Test {
public static void main(String[] args) {
Person p=new Person();
p.setAge(18);
p.setName("小明");
p.setSex(Sex.男);
System.out.println(p);
}
}
```
```
public enum Season {
春,夏,秋,冬;
}
/*
*功能:描述春夏秋冬;
*
*switch(){
*}
*
*byte,short,char,int;
*枚举;
*String类型;
*/
public class Test {
public static void main(String[] args) {
//Season season=Season.春;
Scanner input=new Scanner(System.in);
String str=input.next();
Season season=Season.valueOf(str);//这个方法可以把String类型转成枚举类型,str必须是春夏秋冬;
switch(season){
case 春:
System.out.println("春暖花开");
break;
case 夏:
System.out.println("生如夏花");
break;
case 秋:
System.out.println("秋高气爽");
break;
case 冬:
System.out.println("冬日暖阳");
break;
}
}
}
```
二、注解Annotation
JDK内置的基本注解类型(3个)
自定义注解类型
对注解进行注解(4个)
利用反射获取注解信息
Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理. 通过使用
三个基本的 Annotation:
@Override: 限定重写父类方法, 该注释只能用于方法
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时
@SuppressWarnings: 抑制编译器警告
当一个 Annotation 类型被定义为运行时 Annotation 后, 该注释才是运行时可见, 当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
程序可以调用 AnnotationElement 对象的如下方法来访问 Annotation 信息

JDK5.0提供了专门在注解上的注解类型,分别是:
Retention
Target
Documented
Inherited
@Retention: 只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释
RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
@Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素. @Target 也包含一个名为 value 的成员变量.
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited: 被它修饰的 Annotation 将具有继承性.如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
实际应用中,使用较少