第八章:枚举类与注解
创始人
2024-05-30 04:22:18
0

第八章:枚举类与注解

8.1:枚举类的使用

​ 类的对象只有有限个确定的。我们称此类为枚举类。当需要定义一组常量是,强烈建议使用枚举类。如果枚举类中只有一个对象,则可以作为单例模式的实现方式。

  1. 如何定义枚举类

    • 方式一:JDK5.0之前,自定义枚举类。

      public class SeasonTest {public static void main(String[] args) {Season spring = Season.SPRING;System.out.println(spring); // Season{seasonName=春天,seasonDesc=春暖花开}}
      }
      //自定义枚举类
      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.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求1:提供toString()@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
      }
      
    • 方式二:JDK5.0,可以使用enum关键字定义枚举类。

      public class SeasonTest1 {public static void main(String[] args) {Season1 summer = Season1.SUMMER;System.out.println(summer); // Season{seasonName=春天,seasonDesc=春暖花开}System.out.println(Season1.class.getSuperclass()); // Enum}
      }
      //使用enum关键字枚举类
      enum Season1 implements Info{//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束SPRING("春天","春暖花开"),SUMMER("夏天","夏日炎炎"),AUTUMN("秋天","秋高气爽"),WINTER("冬天","冰天雪地");//2.声明Season对象的属性:private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season1(String seasonName,String seasonDesc){this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//4.其他诉求1:获取枚举类对象的属性public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//4.其他诉求1:提供toString()@Overridepublic String toString() {return "Season1{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
      }
      
  2. Enum类中常用的方法

    • values():返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
    • valueOf(String str):返回枚举类中对象名str的对象,如果没有就抛异常。
    • toString():返回当前枚举类对象常量名称。
    Season1 summer = Season1.SUMMER;
    //toString():返回枚举类对象的名称
    System.out.println(summer.toString());
    //values():返回所有的枚举类对象构成的数组
    Season1[] values = Season1.values();
    for(int i = 0;i < values.length;i++){System.out.println(values[i]);
    }
    //valueOf(String objName):返回枚举类中对象名是objName的对象。
    Season1 winter = Season1.valueOf("WINTER");
    System.out.println(winter);
    
  3. 使用enum关键字定义的枚举类实现接口的情况

    • 情况一:实现接口,在enum类中实现抽象方法。
    • 情况二:让枚举类的对象分别实现接口中的抽象方法。

8.2:注解

  1. 理解注解(Annotation)

    • JDK 5.0开始,Java增加了对元数据MetaData的支持,也就是Annotation(注解)。
    • Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
  2. 注解实例

    • @Override:限定重写父类方法,该注解只能用于方法。

      class Person{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public void walk() {System.out.println("人走路");}
      }class Student extends Person{@Overridepublic void walk() {System.out.println("学生走路");}
      }
      
    • @Deprecated:用于表示所修饰的元素(类,方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择。

      @Deprecated
      public Date(int year, int month, int date) {this(year, month, date, 0, 0, 0);
      }
      
    • @SuppressWarnings:抑制编译器警告。

      @SuppressWarnings("unused")
      int num = 10;
      @SuppressWarnings({"unused", "rawtypes"})
      ArrayList list = new ArrayList();
      
  3. 自定义Annotation

    • 注解类型声明为:@interface
    • 自定义注解自动继承了java.lang.annotation.Annotation接口。
    • 注解的成员变量Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、StringClassenumAnnotation类型。
    • 内部定义成员,通常使用value表示。
    • 可以指定成员的默认值,使用default定义。
    • 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是参数名 = 参数值,如果只有一个参数成员,且名称为value,可以省略value=
    • 如果自定义注解没有成员,表名是一个标识作用。
    public @interface MyAnnotation {String value() default "hello";
    }
    

    注意:自定义注解必须配上注解的信息处理流程才有意义。

  4. JDK中的元注解

    • JDK的元Annoation用于修饰其他Annotation定义。

    • JDK 5.0提供了4个标准的meta-annontation类型,分别是:

      1. Retention

        ​ 只能用于修饰一个Annotation定义,用于指定该Annotation的生命周期,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

        • RetentionPolicy.COURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。
        • RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行Java程序时,不会保留注解。这是默认值。
        • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。
      2. Target

        ​ 用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
        在这里插入图片描述

      3. Documented

        ​ 用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。

        ​ 定义为Documented的注解必须设置Retention值为RUNTIME

      4. Inherited

        ​ 被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

  5. JDK 8中注解的新特性

    • 可重复注解

      1. MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
      2. MyAnnotationTargetRetention等元注解与MyAnnotations相同
      @Inherited
      @Repeatable(MyAnnotations.class)
      @Retention(RetentionPolicy.RUNTIME)
      @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
      public @interface MyAnnotation {String value() default "hello";
      }
      
      @Inherited
      @Retention(RetentionPolicy.RUNTIME)
      @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
      public @interface MyAnnotations {MyAnnotation[] value();
      }
      
      @MyAnnotation(value = "hi")
      @MyAnnotation(value = "abc")
      class Person{
      }
      
    • 类型注解

      1. ElementType.TYPE_RARAMETER:表示该注解能写在类型变量的声明语句中。
      2. ElementType.TYPE_USE:表示该注解能写在使用类型的任何语句中。

相关内容

热门资讯

20年后的家乡五年级作文【精... 20年后的家乡五年级作文 篇一我热爱我的家乡,它是一个美丽的地方,有着清新的空气和绿色的大自然。在2...
牛奶五年级作文(精简6篇) 牛奶五年级作文 篇一牛奶是我们生活中常见的饮品,也是我们身体健康的重要来源之一。牛奶富含丰富的营养物...
小鸟的故事五年级作文(精选3... 小鸟的故事五年级作文 篇一小鸟的故事从古至今,小鸟一直是人们喜爱的动物之一。它们的形象可爱,羽毛绚丽...
20年后的家乡五年级作文50... 20年后的家乡五年级作文500字 篇一20年后的家乡五年级作文我来自一个美丽的小城市,这个城市有着悠...
小学五年级母爱的作文600字... 小学五年级母爱的作文600字 篇一母爱是世界上最伟大的力量,它无私无尽,给予我们无尽的温暖和关怀。在...
读书伴我成长五年级作文【通用... 读书伴我成长五年级作文 篇一随着时间的流逝,我已经是一个五年级的学生了。回想起这五年来,我发现读书对...
不给糖就捣蛋五年级作文(精简... 不给糖就捣蛋五年级作文 篇一今年的万圣节,我和几个好朋友一起决定去“不给糖就捣蛋”!我们精心准备了各...
五年级作文我喜欢的食物【通用... 五年级作文我喜欢的食物 篇一我喜欢的食物食物是人类生活中不可或缺的一部分,每个人都有自己喜欢的食物。...
小学五年级母爱的作文400字... 小学五年级母爱的作文400字 篇一母爱的伟大母爱是世界上最伟大的力量,她是无私的、无条件的。无论我们...
五年级优秀作文(优秀6篇) 五年级优秀作文 篇一我的暑假生活暑假来临了,我迫不及待地开始计划我的暑假生活。首先,我要利用这段时间...
快开学了的五年级作文(优秀5... 快开学了的五年级作文 篇一:新学期的期待新学期即将开始,我迫不及待地期待着迎接新的挑战和机会。虽然暑...
二十年后的家乡五年级作文(最... 二十年后的家乡五年级作文 篇一二十年后的家乡我想象着二十年后的家乡,一切都变得熟悉又陌生。家乡的面貌...
小学五年级母爱的作文600字... 小学五年级母爱的作文600字 篇一母爱是世界上最伟大的力量。她是一种无私奉献的爱,给了我生命,给了我...
我的一本书小学五年级作文(精... 我的一本书小学五年级作文 篇一我的一本书小学五年级作文我最喜欢的一本书是《小王子》。这本书是法国作家...
五年级呼和浩特游记作文300... 五年级呼和浩特游记作文300字19篇 篇一呼和浩特之行我们五年级的同学们,参加了学校组织的一次呼和浩...
无聊的一天五年级作文400字... 无聊的一天五年级作文400字 篇一无聊的一天今天是一个无聊的一天,我不知道该做什么,感觉时间过得很慢...
我们长大了五年级作文【推荐3... 我们长大了五年级作文 篇一随着时间的流逝,我们终于迈入了五年级。这一年,我们不仅在知识上有了更多的收...
水滴历险记五年级作文(精简5... 水滴历险记五年级作文 篇一水滴的历险我是一滴水,经历了一次惊险的冒险旅程。这是我与朋友们一起度过的难...
小学五年级母爱的作文400字... 小学五年级母爱的作文400字 篇一:母爱无私奉献母爱是世界上最伟大的力量,也是最无私的奉献。在我心中...
西游记作文四年级400字【精... 西游记作文四年级400字 篇一西游记是中国古代文学的经典之作,是一部富含智慧和幽默的神话小说。它以孙...