Loading

Java学习笔记03-枚举和注解

1. 枚举

枚举是一组常量的集合。
枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
两种实现方式:

  • 自定义类实现枚举
  • 使用enum关键字实现枚举

1.1 自定义枚举

  1. 构造器私有化
  2. 不需要提供set方法,因为枚举对象通常为只读;
  3. 对枚举对象/属性使用final+static共同修饰,实现底层优化;
  4. 本类内部创建一组对象,枚举对象名通常全部大写;
  5. 枚举对象根据需要,可以有多个属性
public class Enum01 {
    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 WINNER = new Season("冬天", "寒冷");

    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 + '\'' +
                '}';
    }
}

1.2 enum枚举类

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

enum Season2 {
    SPRING("春天", "开花"),
    SUMMER("夏天", "炎热"),
    AUTUMN("秋天", "落叶"),
    WINNER("冬天", "寒冷"), WHAT;
    private String name;
    private String desc;

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

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}
  1. 当使用enum关键字定义一个枚举类时,默认继承Enum类,且是final修饰;
  2. 传统的pubic static final Season2 SPRING = new Season2("春天", "开花");简化成SPRING("春天", "开花"),
  3. 如果使用无参构造器创建枚举类,则实参列表和小括号都可以省略;
  4. 当有多个枚举对象时,使用,间隔,最后要有分号;
  5. 枚举对象必须放在枚举类的最前面。

Enum类成员方法

public class EnumMethod {
    public static void main(String[] args) {
        Season2 autumn = Season2.AUTUMN;
        //输出枚举对象名称
        System.out.println(autumn.name());
        //输出该对象的排序序号,从0开始
        System.out.println(autumn.ordinal());
        //含有定义的所有枚举对象
        Season2[] values = Season2.valuses();
        for (Season2 season: values) {
            System.out.println(season);
        }
        //将字符串转换为枚举对象,要求字符串是已有常量名
        Season2 autumn1 = Season2.valueOf("AUTUMN");
        //比较两个枚举常量的编号,返回两者编号之差
        System.out.println(Season2.AUTUMN.compareTo(Season2.SUMMER));
    }
}

注意

  1. 使用enum关键字后,就不能继承其他类,因为隐式继承Enum类;
  2. enum实现的枚举类,仍可以实现接口。

switch使用枚举类

public static void main(String[] args) {
    //创建枚举对象
    Color green = Color.GREEN;

    switch (green) {
        case YELLOW:
            System.out.println("yellow");
            break;
        case RED:
            System.out.println("red");
            break;
        default:
            System.out.println("none");
    }
}

2. 注解

注解(Annotation)也被称为元数据(Metadata),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。
注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码的补充信息。
JavaSE中,注解使用较为简单,例如标记过失的功能,忽略警告等。JavaEE中注解比较重要,例如可用来配置应用程序的任何切面等。

2.1 基本注解

@Override:限定某个方法,重写父类方法;
@Deprecated:表示某个程序元素已过时;
@SuperessWarnings:抑制编译器警告。

Override

子类重写父类方法时Override注解可以省略,如果写了@Override,编译器会检查该方法是否真的重写了父类方法,如果的确重写则编译通过,如果没有重写则编译错误。
Override只能修饰方法。

class Father {
    public void fly() {
        System.out.println("Father fly");
    }
}

class Son extends Father {
    @Override
    public void fly() {
        System.out.println("Son fly");
    }
}

Deprecated

修饰某个元素,表示该元素已经过时,即不推荐使用,但仍然可以使用。
可以修饰方法、类、字段、包、参数等。
@Deprecated作用可以用于新旧版本的兼容和过渡。

public class Anno01 {
    public static void main(String[] args) {
        A a = new A();
        a.hi();
    }
}

@Deprecated
class A {
    public int n1 = 10;
    @Deprecated
    public void hi() {

    }
}

SuppressWarning

用来抑制警告信息,在{""}中填入希望抑制的警告。
作用范围与注解放置位置有关,可以放在具体语句、方法、类之上。
all抑制所有警告,unchecked忽略没有检查的警告,rawtypes忽略没有指定泛型的警告,unused忽略没有使用某个变量的警告。

public class Anno01 {
    @SuppressWarnings({"rawtypes", "unchecked"})
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("tom");
        list.add("jack");
        int i;
        System.out.println(list.get(0));
    }
}

2.2 四种元注解

元注解用于修饰其他注解。

  1. @Retention指定注解的作用范围,三种SOURCE、CLASS、RUNTIME。

只能用于修饰一个注解,指定该注解可以保留多久,包含一个RetensionPolicy类型的成员变量,使用该注解时必须为该成员变量指定值:
RetensionPolicy.SOURCE编译器使用后直接丢弃这种策略的注解;RetensionPolicy.CLASS编译器把注解记录在class文件中,当运行Java程序时,JVM不会保留注解,这是默认值;RetensionPolicy.RUNTIME编译器把注解记录在class文件中,当运行Java程序时,JVM会保留注解,程序可通过反射获取该注解。

  1. @Target指定注解可以在哪些地方使用。

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

  1. @Documented指定该注解是否会在javadoc体现。
  2. @Inherited子类会继承父类注解。

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

posted @ 2022-03-20 17:42  KRDecad3  阅读(20)  评论(0编辑  收藏  举报