Java - 枚举类和注解

枚举类其他博客

一、枚举类介绍

把具体的对象一个个例举出来的类,称为枚举类。

二、自定义实现枚举类

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

示例:

package Enum_;

public class Enum02 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
    }
}

//演示自定义枚举类实现
class Season {
    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 WINTER = new Season("冬天","寒冷");

    //1.将构造器私有化,目的防止 直接new
    //2.去掉set方法,防止属性被修改
    //3.在 Season 内部,直接创建固定的对象
    //4.优化:可以加入 final 修饰符
    private Season(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 "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

image.png

小结:

  1. 构造器私有化
  2. 本类内部创建一组对象。
  3. 对外暴露对象(通常为对象添加 public final static 修饰符)。
  4. 可以提供 get 方法,但是不用提供 set 方法。

三、enum关键字实现枚举类

示例:

package Enum_;

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

enum Season2 {

    //如果使用 enum 来实现枚举类
    //1. 使用关键字 enum 替换 class
    //2. public static final Season SPRING = new Season("春天","温暖");直接使用
    //   SPRING("春天","温暖");
    //3. 如果有多个常量(对象),使用 逗号间隔即可。
    //4. 如果使用 enum 来实现枚举类,要求将定义的常量对象写在最前面。
    SPRING("春天","温暖"),
    SUMMER("夏天","炎热");
    private String name;
    private String desc;//描述

    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 "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

image.png

注意事项:

  1. 当我们使用 enum 关键字来开发一个枚举类时,默认会继承 Enum类,而且是一个 final 类。

下面我们来证明下:使用反编译指令javap

image.png
2. 传统的 public static final Season2 SPRING = new Season2("春天","温暖");简化成 SPRING("春天","温暖"),调用的是有两个字符串的构造器。
2. 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略。
2. 当有多个枚举对象时,使用逗号间隔,最后一个分号结尾。
2. 枚举对象必须放在枚举类的行首。
2. 构造器要私有化。


> **细节:** > 1. **使用 enum 关键字后,就不能再继承其他类了,因为 enum 会隐式继承Enum,而Java是单继承机制。** > 1. **枚举类和普通类一样,可以实现接口,如下形式:
**`**enum 类名 implements 接口1,接口2{}**`

四、JDK内置的基本注解类型

1. 注解的理解

  1. 注解(Annotation)也称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
  2. 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。

2. 基本的 Annotation 介绍

使用 Annotation 时要在其前面增加 @ 符号,并把该 Annotation 当成一个修饰符使用,用于修饰它支持的程序元素。

三个基本的 Annotation:

  1. @Override:限定某个方法,是重写父类方法,该注解只能用于方法。
    示例:
package annotation;

public class Override {
}

class Father {
    public void fly() {
        System.out.println("father 正在飞");
    }
}

class Son extends Father {

    //1. @Override 注解放在 fly 方法上,表示子类 fly 方法重写了父类的 fly
    //2. 这里如果没有写 @Override 还是重写了父类fly
    //3. 如果写了@Override注解,编译器就会去检查该方法是否真的重写了父类的方法,
    //    如果的确重写了,则编译通过,如果没有构成重写,则编译错误。
    //4. 看看@Override的定义
    // 解读:如果发现 @interface ,则表示一个 注解类
    /*
        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }
     */
    @java.lang.Override
    public void fly() {
        System.out.println("son 正在飞");
    }
}

Override 使用说明:
image.png

  1. @Deprecated:用于表示某个程序元素(类、方法等)已过时。
    示例:
package annotation;

public class Deprecated {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.n1);
        a.hi();
    }
}

//1. @Deprecated 修饰某个元素,表示该元素已经过时了
//2. 即不再推荐使用,但是仍然可以使用
//3. 查看 @Deprecated 注解类的源码
//4. 可以修饰方法,类、字段、包、参数等
//5. @Deprecated 可以做版本升级过渡使用
/*
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
 */
@java.lang.Deprecated
class A {
    public int n1 = 10;
    public void hi(){
    }
}

image.png

  1. @SuppressWarnings:一直编译器警告。
    示例:
package annotation;

import java.util.ArrayList;
import java.util.List;

public class SuppressWarnings_ {
    @SuppressWarnings({"all"})
    public static void main(String[] args) {
        //1. 当我们不希望看到这些经过的时候,可以使用 SuppressWarnings 注解来抑制经过信息
        //2. 在 {""} 中,可以写入你希望抑制(不显示)的警告信息。
        //3. 关于 SuppressWarnings 作用范围是和你放置的位置相关
        //   比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main
        //   通常我们可以放置具体的语句、方法、类。
        //4. 看看 @SuppressWarnings 的源码
        // (1)放置的位置就是 TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
        // (2)该注解类有数组:String[] value() 设置一个数组比如 {"rawtypes","unchecked"}
        /*
        @Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
        @Retention(RetentionPolicy.SOURCE)
        public @interface SuppressWarnings {
                String[] value();
        }
         */
        List list = new ArrayList();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        int i;
        System.out.println(list.get(1));
    }
}

image.png

五、元注解:对注解进行注解(了解)

image.png
image.png
image.png
image.png
image.png
image.png
image.png

posted @   interestinmachine  阅读(132)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示