枚举和注解

JDK1.5之前需要自定义枚举类

JDK 1.5 新增的 enum 关键字用于定义枚举类

枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰

枚举类和普通类的区别:

使用 enum 定义的枚举类默认继承了 java.lang.Enum 类

枚举类的构造器只能使用 private 访问控制符

枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾). 列出的实例系统会自动添加 public static final 修饰

1、枚举类的主要方法:

values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190625202946118.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwMTE5Mg==,size_16,color_FFFFFF,t_70)

```

/*

*枚举是一种数据类型;

*类    是一种数据类型;

*

*如果我们需要一组常量,建议用枚举;

*

*枚举:

*星期:日,一到六;

*颜色:赤橙黄绿青蓝紫;

*四季:春夏秋冬;

*职称:正,副,

*

*用法:

*枚举名.属性名;

*/

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 信息

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190625203608119.png)

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, 则其子类将自动具有该注解

实际应用中,使用较少

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 1.5发行版本新增了两个引用类型家族:枚举类型(Enumerate类)和注解类型(Annotation接...
    Timorous阅读 421评论 0 0
  • 30、用enum代替int常量 枚举类型是指由一组固定的常量组成合法值的类型。在java没有引入枚举类型前,表示枚...
    Alent阅读 764评论 1 5
  • Java 有两种特殊形式的类和接口,在类型系统中扮演着特定的角色。这两种类型是枚举类型(enumerated ty...
    郭艺宾阅读 348评论 0 0
  • 枚举和注解是Java1.5版本中新增的特性,本章讨论使用它们时的最佳实践。本章内容导图: 1.用enum代替int...
    塞外的风阅读 980评论 0 0
  • Java 枚举和注解总结 枚举 没有枚举前我们基本上常量来定义值: 如果有了枚举后我们会怎样了? 代码是不是就清晰...
    陈小白_阅读 2,142评论 2 0