1、枚举类的使用
- 类的对象只有有限个,确定的。
- 当需要定义一组常量时,建议使用枚举类。
- 两种定义方法
- 自定义枚举类(JDK 5之前)
- 步骤:
- 定义
private final
属性 - 定义
private
构造器,为属性赋予初值 - 使用new,创建
public static final
对象 - 重写toString(可选)
- 定义
- 步骤:
- 使用enum关键字定义枚举类(JDK 5之后)
- 定义的枚举类默认继承与
java.lang.Enum类
- 步骤:
- 使用
enum
关键字修饰枚举类 - 定义
private final
属性 - 定义
private
构造器,为属性赋予初值 - 使用
对象名(属性值)
定义枚举类对象,多个枚举类之间用逗号隔开,最后一个枚举类对象用分号结束。该语句放在类的开头。
- 使用
- 定义的枚举类默认继承与
- 自定义枚举类(JDK 5之前)
public class Demo01 {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
class Season{
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
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("冬天","冰天雪地");
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
以上就是自定义枚举类
public class Demo01 {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}
enum Season{
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地");
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}
以上就是enum关键字定义的枚举类
-
Enum类常用方法
values()
:返回枚举类型的对象数组,常用与遍历所有的枚举值。比如Season.values()
valueOf(String str)
:将一个字符串转换为同名的枚举类对象。比如Season.valueOf("WINTER")
toString()
:返回当前枚举类对象常量的名称。
-
使用枚举类来实现接口,并利用匿名内部类根据不同对象重写不同的方法。
public class Demo01 {
public static void main(String[] args) {
Season spring = Season.SPRING;
spring.show();
}
}
enum Season implements Info {
SPRING("春天","春暖花开"){
@Override
public void show() {
System.out.println("春天");
}
},
SUMMER("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("夏天");
}
},
AUTUMN("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋天");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("冬天");
}
};
private final String seasonName;
private final String seasonDesc;
private Season(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
}
interface Info{
void show();
}
2、注解(Annotation)
- 代码里的特殊标记,比如
@override
。 - 注解实质上是一些补充信息,编译器可以通过这些信息进行验证或部署。
- 可以修饰
包、类、构造器、方法、成员变量、参数、局部变量
。 框架 = 注解 + 反射 + 设计模式
。- 使用
- 生成帮助文档的注解,比如
@author, @return
- 在编译时进行格式检查
@Override
:重写父类方法@Deprecated
:表示已过时@SuppressWarnings
:抑制编译器警告
- 跟踪代码依赖性,实现替代配置文件功能
- 生成帮助文档的注解,比如
- 自定义注解(很少用)
- 使用
@interface
关键字,比如public @interface MyAnnotation
- 默认继承
java.lang.annotation.Annotation接口
- 配置参数的定义
- 以
参数类型 参数名()
的形式声明,参数类型只能是基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组、泛型类型T(JDK 8)
。比如,String[] value()
- 若指定初始值,可使用
default
关键字。比如String value() default "hello"
- 以
- 若有配置参数,则使用时必须指定参数值,除非它有默认值。格式是
@MyAnnotation(参数名 = 参数值)
,若只有一个参数,且名称为value,可以省略“value = ”。
- 使用
元注解(meta-annotation)
- 本身也是一个注解,用来对现有注解进行修饰
- 有四个标准的元注解
- Retention
- 指定一个注解的声明周期
- 有一个
RetentionPolicy
类型的成员变量,使用时为value指定以下值:- RetentionPolicy.SOURCE:在源文件中有效
- RetentionPolicy.CLASS:在class文件中有效,默认
- RetentionPolicy.RUNTIME:在运行时有效,可以通过反射获取
- Target
- 用来指定被修饰的Annotation能用于修饰哪些程序元素。枚举类
ElementType
中定义了一些常量。
- 用来指定被修饰的Annotation能用于修饰哪些程序元素。枚举类
- Documented
- 表示所修饰的Annotation在被javadoc解析时,保留下来。
- Inherited
- 被它修饰的注解,则其子类将自动具有该注解。可以用
Class对象.getAnnotations()
方法来查看所有注解。
- 被它修饰的注解,则其子类将自动具有该注解。可以用
- Retention
//定义一个注解
//Target 表示我们的注解可以用在哪些地方
@Target(value={ElementType.METHOD,ElementType.TYPE})
//Retention 表示我们的注解在什么地方还有效
@Retention(value= RetentionPolicy.RUNTIME)
//Documented 表示是否将我们的注解生成在Javadoc中
@Documented
//Inherited 表示子类可以继承父类的注解
@Inherited
@interface MyAnnotation{
}
- JDK 8 新特性
- 可重复注解。
- 其实这特性比较鸡肋,重复注解可以用注解的数组来替代,例如,定义了一个注解MyAnnotation,然后我们可以再定义一个注解MyAnnotations,里面的配置参数是
MyAnnotation[] value
即可。
- 其实这特性比较鸡肋,重复注解可以用注解的数组来替代,例如,定义了一个注解MyAnnotation,然后我们可以再定义一个注解MyAnnotations,里面的配置参数是
- 类型注解(Target注解中的可选的)
ElementType.TYPE_PARAMETER
:表示该注解能写在类型变量的声明语句中,如:泛型。ElementType.TYPE_USE
:表示该注解能写在使用类型的任何语句中。
- 可重复注解。