一. 自定义枚举类
- 不使用关键字定义枚举类
// 声明枚举类
class Season{
// 提供类的属性 private final
private final String name;
private final String desc;
// 声明final的属性, 在构造器中初始化
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 通过公共的方法获取属性
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
// 创建枚举类对象
public static final Season SPRING = new Season("spring", "春暖花开");
public static final Season SUMMER = new Season("summer", "炎炎夏日");
public static final Season AUTUMN = new Season("autumn", "秋高气爽");
public static final Season EAST = new Season("east", "岁暮天寒");
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
- 使用enum关键字定义枚举类
enum Season {
SPRING("spring", "春暖花开"),
SUMMER("summer", "炎炎夏日"),
AUTUMN("autumn", "秋高气爽"),
EAST("east", "岁暮天寒");
private final String name;
private final String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
常用的方法: values(), valueOf(String name) 要传入的形参是枚举类对象的名字, 否则报java.lang.IllegalArgumentException异常
public static void main(String[] args) {
Season[] values = Season.values();
for (Season season : values) {
System.out.println(season);
}
/** print
Season{name='spring', desc='春暖花开'}
Season{name='summer', desc='炎炎夏日'}
Season{name='autumn', desc='秋高气爽'}
Season{name='east', desc='岁暮天寒'}
*/
String str = "SPRING";
Season season = Season.valueOf(str);
System.out.println(season);
/** print
Season{name='spring', desc='春暖花开'}
*/
}
如何让枚举类实现接口: 可以让不同的枚举类的对象调用被重写的抽象方法, 执行的效果不同(相当于让每个对象重写抽象方法)
interface Info{
void show();
}
enum Season implements Info{
SPRING("spring", "春暖花开"){
public void show(){
System.out.println("春风拂槛露华浓");
}
},
SUMMER("summer", "炎炎夏日"){
public void show(){
System.out.println("连雨不知春去,一晴方觉夏深。");
}
},
AUTUMN("autumn", "秋高气爽"){
public void show(){
System.out.println("万里悲秋常作客, 百年多病独登台");
}
},
EAST("east", "岁暮天寒"){
public void show(){
System.out.println("老骥伏枥, 志在千里。烈士暮年,壮心不已");
}
};
private final String name;
private final String desc;
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
@Override
public String toString() {
return "Season{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
二. 注解Annotation
- JDK提供的常用注解
@Override: 限定重写父类方法, 该注解只能用于方法
@Deprecated: 用于表示某个程序元素(类, 方法等) 已过时
@SuppressWarnings: 抑制编译器警告
- 如何自定义一个注解
public @interface MyAnnotation {
String values() default "DanielsShelby";
}
- 元注解
JDK的元Annotation用于修饰其他Annotation定义 JDK5.0提供了专门的注解上的注解类型, 分别是:
Retention: 只能用于修饰一个Annotation定义, 用于指定该Annotation可以保留多长时间, @Retention包含一个RetentionPolicy类型的成员变量(使用Rentention时必须为该value成员变量指定值)
Target: 用于修饰Annotation定义, 用于指定被修饰的Annotation能用于修饰哪些程序元素. @Target也包含一个名为value的成员变量
Documented: 用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档 (定义Documented的直接必须设置Retention值为RUNTIME)
Inherited: 被修似乎的Annotation将具有继承性. 如果某个类使用了被@Inherited修饰的Annotation, 则其子类将自动具有该注解 (实际应用中, 使用较少)