Java基础学习笔记整理了我从零开始学习Java时所学习到的内容。
以下内容参考尚硅谷Java教程。
十一、枚举类与注解
1 枚举类
- 枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类;
- 当需要定义一组常量时,强烈建议使用枚举类;
- 如果枚举类只有一个对象,则可以作为单例模式的实现方式。
1.1 如何自定义枚举类(jdk 5.0 之前)
使用class
//枚举类创建方式一:自定义枚举类
class Season{
// 1.声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
// 2.提供私有的初始化构造器
private Season(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.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.(获取枚举类对象的属性)
public String getSeasonName(){
return seasonName;
}
public String getSeasonDesc(){
return seasonDesc;
}
//5.(提供toString方法)
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
1.2 使用enum关键字定义枚举类(jdk5.0新增)
enum Season1{
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎");
// 1.声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc;
// 2.提供私有的初始化构造器
Season1(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
//情况一:所有的枚举类对象调用同样的方法
// @Override
// public void show() {
// System.out.println("这是一个季节");
// }
//
1.3 Enum中的常用方法
toString():返回枚举类对象的名称
values():返回枚举类对象构成的数组
valuesOf(String objName):返回枚举类中对象名是objName的对象。
Season1 summer = Season1.SUMMER;
//Enum.toString()
System.out.println(summer);
//System.out.println(Season1.class.getSuperclass());
System.out.println("*****************************");
//values():将枚举类的所有对象生成一个数组
Season1[] values = Season1.values();
System.out.println(values[0]);
System.out.println(values[1]);
System.out.println("*****************************");
//valueOf(String objName):返回当前枚举类与objName同名的对象
//如果没有同名对象,则抛出异常
Season1 spring = Season1.valueOf("SPRING");
System.out.println(spring);
spring.show();
1.4 使用enum定义枚举类后,枚举类对象分别实现接口
interface Info{
void show();
}
enum Season1 implements Info{
SPRING("春天","春暖花开"){
@Override
public void show() {
System.out.println("这是一个春天");//情况二:让每个枚举类的对象重写接口中的方法
}
},
SUMMER("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("这是一个夏天");
}
};
}
2 注解
- 注解是jdk 5.0中新增的功能;
- Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原逻辑的情况下,在源文件中嵌入一些补充信息;
- 在Java SE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在Jav a EE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替Java EE旧版中所遗留的繁冗代码和XML配置等。
框架 = 注解 + 反射机制 + 设计模式
2.1 注解的使用示例
- 示例一:生成文档相关的注解
- 示例二:在编译时进行的格式检查(JDK内置的三个基本注解)
@Override:重写
@Deprecated:表示已过时
@SuppressWarnings:抑制编译器警告 - 示例三:跟踪代码依赖性,实现替代配置文件功能
2.2 自定义注解
参照@SuppressWarnings定义:
- 注解声明为@interface
- 内部定义成员,通常使用value表示
- 可以指定成员默认值,使用default定义
- 如果自定义注解没有成员,表明是一个标识作用
说明:
如果注解有成员,在使用注释时,需要指明成员的值;
自定义注解必须配上注解的信息处理流程(反射)才有意义;
自定义注解通常会指明Retention和Target。
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface MyAnnotation {
String value() default "hello";
}
2.3 元注解
- Retention:指定所修饰的Annotation的生命周期:RetentionPolicy.SOURCE/CLASS(默认)/RUNTIME,只有生命为RUNTIME的注解才可以被反射获取;
- Target:指定所修饰的Annotation可以修饰哪些程序元素;
- Documented:表示所修饰的注解在被javadoc解析时保留下来;
- Inherited:被他修饰的Annotation将具有继承性。
2.4 如何获取注解信息
通过反射来进行获取、调用。
前提:要求此注解的元注解Retention中声明的生命周期为:RUNTIME。
2.5 jdk8中注解的新特性:可重复注解、类型注解
可重复注解:
- 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class;
- MyAnnotation的Target和Retention等元注解与MyAnnotations相同。
类型注解:
- ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中(如:泛型);
- ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中。