枚举类:类的对象只有有限个,是确定的。如星期、性别、季节、月份、线程状态等。
当需要定义一组常量时,强烈建议使用枚举类。
如果一个类只有一个对象,则可以使用单例模式来实现枚举类。
1.如何定义使用枚举类?
方式1:JDK 5.0 之前,自定义枚举类
//自定义枚举类
public class EnumTest {
public static void main(String[] args) {
Season summer = Season.SUMMER; //调用枚举类
System.out.println(summer);
System.out.println(summer.getSeasonName());
System.out.println(summer.getSeasonDesc());
}
}
class Season{
//1.声明Season对象的属性:private final修饰
private final String SeasonName;
private final String SeasonDesc;
//2.私有化类的构造器,并给相应的属性赋值
private Season(String seasonName, String seasonDesc) {
SeasonName = seasonName;
SeasonDesc = seasonDesc;
}
//3.提供当前枚举类的多个对象,使用public static final修饰
public static final Season SPRING = new Season("春天","春暖花开");
public static final Season SUMMER = new Season("夏天","鸟语花香");
public static final Season AUTUMN = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","冰天雪地");
//4.其他诉求:获取对象的属性,重写toString()方法等
public String getSeasonName() {
return SeasonName;
}
public String getSeasonDesc() {
return SeasonDesc;
}
@Override
public String toString() {
return "Season{" +
"SeasonName='" + SeasonName + ''' +
", SeasonDesc='" + SeasonDesc + ''' +
'}';
}
}
方式2:JDK 5.0 之后,使用enum关键字定义枚举类
//使用enum关键字创建枚举类(默认继承自class java.lang.Enum)
public class EnumTest01 {
public static void main(String[] args) {
ThreadStatus statu = ThreadStatus.TIMED_WAITING;
System.out.println(statu);
System.out.println(ThreadStatus.class.getSuperclass()); //该类的直接父类
}
}
enum ThreadStatus{
//1.提供枚举类的多个对象,多个对象使用","隔开,末尾使用";"结束
NEW("新建","创建一个线程"),
RUNNABLE("就绪","线程就绪"),
BLOCKED("阻塞","线程阻塞"),
WAITING("等待","线程等待"),
TIMED_WAITING("超时等待","线程超时等待"),
TERMINATED("死亡","线程死亡");
//2.声明枚举类对象的属性:private final修饰
private final String name;
private final String statu;
//3.私有化类的构造器,并给相应的属性赋值
private ThreadStatus(String name,String statu) {
this.name = name;
this.statu = statu;
}
//4.其他诉求:获取对象的属性,重写toString()方法等
public String getName() {
return name;
}
public String getStatu() {
return statu;
}
@Override
public String toString() {
return super.toString();
}
}
2.Enum类的常用方法:
① values()方法:返回枚举类型的对象数组,用于遍历该枚举类所有的枚举值。线程的六种状态
Thread.State[] values1 = Thread.State.values();//获取线程的状态,返回一个数组
② valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名称”。若不是,会有运行时异常:IllegalArgumentException。
ThreadStatus status = ThreadStatus.valueOf("TERMINATED");
③ toString():返回当前枚举类对象常量的名称
ThreadStatus status1 = ThreadStatus.TIMED_WAITING;//返回TIMED_WAITING名称 System.out.println(status1.toString()); //TIMED_WAITING
3.enum枚举类实现接口
情况一:实现接口,在enum类中实现抽象方法
public void show(){
System.out.println("当前枚举类是线程的生命周期...");
}
情况二:让enum类的对象分别实现抽象方法
NEW("新建","创建一个线程"){
@Override
public void show() {
System.out.println("正在创建线程...");
}
},
...
二.注解(annotations)
从JDK 5.0 开始,增加了对元数据的支持(metadata),也就是注解。注解其实就是代码里的特殊标记,它用于替代配置文件,Java中可以通过反射技术去得到类里面的注解,以决定怎么去运行类。
在一定程度上:框架=注解+设计模式+反射
1.JDK内置的三个注解
@Override:用于重写父类的方法 或者是写接口实现类时用到该注解。
@Deprecated:用于表示该方法是一个过期的方法。
@suppressWarnings:表示该方法、变量在编译时自动忽略警告。
2.自定义注解
注解声明为:@interface,内部定义成员,通常使用value表示,可以指定成员的默认值,使用default定义,如果自定义注解没有成员,表明是一个标识作用。
public @interface MyAnnotation { //自定义注解,暂时无法使用,因为未指定用法
String values() default "java";
}
3.JDK中的元注解
对现有的注解进行解释说明的注解称为元注解。共有如下4种。JAVA核心知识点–元注解详解
@Retention:指定所修饰的Annotation的生命周期。
public enum RetentionPolicy {
SOURCE, // 源文件保留
CLASS, // 编译期保留,默认值
RUNTIME // 运行期保留,可通过反射去获取注解信息
}
@Target:指定Annotation能修饰那些程序元素
public enum ElementType {
TYPE, // 类、接口、枚举类
FIELD, // 成员变量(包括:枚举常量)
METHOD, // 成员方法
PARAMETER, // 方法参数
CONSTRUCTOR, // 构造方法
LOCAL_VARIABLE, // 局部变量
ANNOTATION_TYPE, // 注解类
PACKAGE, // 可用于修饰:包
TYPE_PARAMETER, // 类型参数,JDK 1.8 新增
TYPE_USE // 使用类型的任何地方,JDK 1.8 新增
}
@documented:表示所修饰的注解在Java doc解析时保留下来
@Inherited:被它标注的Annotation将具有继承性
4.可重复注解
在JDK 1.8中,增加了可重复注解:
① 在需要重复注解的注解MyAnnotation上添加@Repeatable注解,值为注解名.class。
② MyAnnotation的Target和Retention等元注解和MyAnnotations相同。
5.类型注解
在JDK 1.8中,增加了类型注解:
ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中(如:泛型声明)
ELementType. TYPE_USE表示该注解能写在使用类型的任何语句中。



