11.枚举和注解|Java学习笔记

文章目录

  • 枚举 enumeration enum
    • 自定义实现枚举
      • 自定义类实现枚举总结
    • 使用enum关键字实现枚举
      • 实现方法
      • Enum类方法
      • enum实现接口
  • 注解
    • 注解的理解
    • JDK的元Annotation(元注解)

枚举 enumeration enum

从一个需求引入:
要求创建季节(Season) 对象,请设计并完成。

因为对于季节而已,他的对象(具体值),是固定的四个,不会有更多

枚举类[枚: 一个一个 举: 例举 , 即把具体的对象一个一个例举出来的类就称为枚举类]

  1. 枚举是一组常量的集合
  2. 枚举属于一种特殊的类,里面里包含一组有限的特定的对象

自定义实现枚举

  1. 不需要提供setXxx 方法,因为枚举对象值通常为只读。
  2. 对枚举对象/属性使用final + static共同修饰,实现底层优化
  3. 枚举对象名通常使用全部大写,常量的命名规范.
  4. 枚举对象根据需要,也可以有多个属性
package com.fwedu.enum_;

public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season2.SPRING);
        System.out.println(Season2.WINNER);
    }
}

class Season2 {
    private String name;
    private String desc;

    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 WINNER = new Season("冬天", "寒冷");

    // 1.将构造器私有化,目的防止 直接new
    // 2.去掉set方法,防止属性被修改
    // 3.在Season内部,直接创建固定的对象
    // 4.优化,可以加入final修饰符(static final)

    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season2{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}


class Season {
    private String name;
    private String desc;

    public Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

自定义类实现枚举总结

  1. 构造器私有化
  2. 本类内部创建一组对象 【四个 春夏秋冬】
  3. 对外暴露对象(通过为对象添加 public final static 修饰符)
  4. 可以提供 get 方法,但是不要提供 set

使用enum关键字实现枚举

实现方法

package com.fwedu.enum_;

public class Enumeration03 {
    public static void main(String[] args) {
        System.out.println(Season3.SPRING);
    }
}

enum Season3 {
    SPRING("春天", "温暖"), SUMMER("夏天", "炎热");
    private String name;
    private String desc;

    Season3(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Season3{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
  1. 当我们使用 enum 关键字开发一个枚举类时, 默认会继承 Enum 类,而且该定义的枚举类是一个 final 类
  2. 传统的 public static final Season2 SPRING = new Season2(“春天”, “温暖”); 简化成 SPRING(“春天”, “温暖”), 这里必须知道,它调用的是哪个构造器。
  3. 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略。
  4. 当有多个枚举对象时, 使用,间隔, 最后有一个分号结尾。
  5. 枚举对象必须放在枚举类的行首

Enum类方法

使用关键字 enum 时,会隐式继承 Enum 类, 这样我们就可以使用 Enum 类相关的方法。
11.枚举和注解|Java学习笔记_第1张图片

举例说明 enum 常用方法的使用:

package com.fwedu.enum_;

public class EnumMethod {
    public static void main(String[] args) {
        Season3 spring = Season3.SPRING;

        System.out.println(spring.name());

        System.out.println(spring.ordinal());   // 返回当前对象的位置号,默认从0开始

        Season3[] season3s = Season3.values();  // 返回当前枚举类中所有的常量
        for (Season3 season3: season3s) {
            System.out.println(season3);
        }

        Season3 spring1 = Season3.valueOf("SPRING");    // 将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常!
        System.out.println("spring1=" + spring1);
        System.out.println(spring == spring1);

        System.out.println(Season3.SPRING.compareTo(Season3.SUMMER));   // 比较两个枚举常量,比较的就是编号
    }
}

enum实现接口

enum不能继承类,因为已经隐式继承了Enum类。

但是可以实现接口。

package com.fwedu.enum_;

public class EnumDetail {
    public static void main(String[] args) {
        Music.CLASSICMUSIC.playing();
    }
}

interface IPlaying {
    public void playing();
}

enum Music implements IPlaying {
    CLASSICMUSIC;
    @Override
    public void playing() {
        System.out.println("播放好听的音乐...");
    }
}

注解

注解的理解

  1. 注解(Annotation)也被称为元数据(Metadata), 用于修饰解释 包、 类、 方法、 属性、 构造器、 局部变量等数据信息。
  2. 和注释一样, 注解不影响程序逻辑, 但注解可以被编译或运行, 相当于嵌入在代码中的补充信息。
  3. 在 JavaSE 中, 注解的使用目的比较简单, 例如标记过时的功能, 忽略警告等。 在 JavaEE 中注解占据了更重要的角 色, 例如用来配置应用程序的任何切面, 代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等。

三个基本的 Annotation:

  1. @Override: 限定某个方法, 是重写父类方法, 该注解只能用于方法
  2. @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
  3. @SuppressWarnings: 抑制编译器警告

@interface是注解类

如果你写了@Override 注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误。

JDK的元Annotation(元注解)

元注解这部分不太重要,只需要知道它是修饰注解的注解就好。(了解,看 JDK 源码的时候需要明白)

  1. Retention //指定注解的作用范围, 三种SOURCE,CLASS,RUNTIME
  2. Target // 指定注解可以在哪些地方使用
  3. Documented //指定该注解是否会在 javadoc 体现
  4. Inherited //子类会继承父类注解

@Retention
只能用于修饰一个 Annotation 定义, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy
类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
@Retention 的三种值

  1. RetentionPolicy.SOURCE: 编译器使用后, 直接丢弃这种策略的注释
  2. RetentionPolicy.CLASS: 编译器将把注解记录在 class文件中.当运行 Java 程序时, JVM 不会保留注解。 这是默认值
  3. RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中.当运行 Java 程序时, JVM 会保留注解. 程序可以通过反射获取该注解

@Target
用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。


@Documented
用于指定该元Annotation修饰的Annotation类将被javadoc工具提取成文档,即在生成文档时,可以看到该注解。

说明:定义为Documented的注解必须设置Retention值为RUNTIME。


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


你可能感兴趣的:(Java,java,枚举,注解)