枚举类

简介: java枚举类

一 场景

当需要表示几个固定值的时候,可以使用枚举来限制。如:星期、季节、成绩等级等等;所以一般枚举类对应的是项目里的字典表;

枚举类本质就是一个特殊的类,继承enum类,所以自定义的枚举类不可以再继承其他类了,但是可以实现其他接口;

枚举元素

枚举类里列出的类型叫做枚举元素,如季节的枚举元是春夏秋冬,成绩等级的枚举元素是ABCD四个等级.....

二 案例

这里以成绩等级作为案例,假设总共分为ABCD四个等级

2.1 验证枚举类的父类

自定义枚举类如下

public enum ScoreLevelEnum {
   
   

}

测试类

public class ScoreInput {
   
   
    public static void main(String[] args) {
   
   
        //枚举类父类
        System.out.println(ScoreLevelEnum.class.getSuperclass());
    }
}

结果
image.png

由于自定义的枚举类已经继承enum类,所以自定义的枚举类不可以再继承其他类了,但是可以实现其他接口;

2.2 枚举类只有一个枚举元素的情况

此时的枚举类是单例的设计模式(单例:懒汉式、饿汉式、枚举)

2.3 默认构造器都是私有的

测试类

直接报错
image.png

由于枚举类构造器是私有的,所以不能被继承,即不可以有子类,因为子类实例化的时候需要先调父类的构造器;

2.4 可以定义普通方法

静态、非静态方法都可以

非静态方法

枚举类

public enum ScoreLevel {
   
   
    A,B,C,D;
   public void printLevel(){
   
   
       //this:当前对像(谁调用这个方法,this就是谁)
       System.out.println(this);
   }
}

测试

public class ScoreInput {
   
   
    public static void main(String[] args) {
   
   
        ScoreLevel.A.printLevel();
    }
}

结果
image.png

静态方法

枚举类

在这里插入代码片

2.5 可以定义抽象方法

枚举类

package com.maltose.demo.test;

public enum ScoreLevel {
   
   
    A{
   
   
        @Override
        public void say() {
   
   
            System.out.println("A等级");
        }
    }

    ,B {
   
   
        @Override
        public void say() {
   
   
            System.out.println("B等级");
        }
    },
    C {
   
   
        @Override
        public void say() {
   
   
            System.out.println("C等级");
        }
    },
    D {
   
   
        @Override
        public void say() {
   
   
            System.out.println("D等级");
        }
    };

  public abstract void say();
}

2.6 常用方法

枚举类

package com.maltose.demo.test;

public enum ScoreLevel {
   
   
    A{
   
   
        @Override
        public void say() {
   
   
            System.out.println("A等级");
        }
    }

    ,B {
   
   
        @Override
        public void say() {
   
   
            System.out.println("B等级");
        }
    },
    C {
   
   
        @Override
        public void say() {
   
   
            System.out.println("C等级");
        }
    },
    D {
   
   
        @Override
        public void say() {
   
   
            System.out.println("D等级");
        }
    };

  public abstract void say();
}

测试类1

public class ScoreInput {
   
   
    public static void main(String[] args) {
   
   
        ScoreLevel[] values = ScoreLevel.values();
        for (int i = 0; i < values.length; i++) {
   
   
            System.out.println(values[i].name()+": "+values[i].ordinal());
        }
    }
}

结果
image.png

测试类2

public class ScoreInput {
   
   
    public static void main(String[] args) {
   
   
        //把字符串"A"变为枚举元素
        ScoreLevel scoreLevel = ScoreLevel.valueOf("A");
        System.out.println(scoreLevel.name());
        scoreLevel.say();
    }
}

结果
image.png

三 枚举的另一种用法

在第二章里,每个枚举元素都是一个固定值,而在字典表里,一般都是两个值互相对应的,比如YES对应数字1,NO对应数字0

枚举类

package com.maltose.demo.test;

public enum ScoreLevel {
   
   
    YES("1"),
    NO("0");

    private String code;

    ScoreLevel(String code) {
   
   
        this.code = code;
    }

    public String getCode() {
   
   
        return code;
    }

    public void setCode(String code) {
   
   
        this.code = code;
    }
}

测试

package com.maltose.demo.test;

public class ScoreInput {
   
   
    public static void main(String[] args) {
   
   
        System.out.println(ScoreLevel.YES.getCode());
        System.out.println(ScoreLevel.NO.getCode());
    }
}

结果
image.png

相关文章
|
6月前
|
开发框架 Java 编译器
Java反射,枚举讲解
Java反射,枚举讲解
71 0
|
2月前
|
Java 编译器
|
6月前
|
XML 安全 Java
反射&&枚举
反射&&枚举
36 0
|
6月前
|
Java 编译器
枚举类的使用
枚举类的使用
|
6月前
|
Java 编译器
枚举类的final修饰
枚举类的final修饰
|
6月前
|
SQL Java 数据库连接
myabtis中是否可以映射 Enum 枚举类
myabtis中是否可以映射 Enum 枚举类
|
Java 索引
枚举类 - 自定义枚举类与使用enum关键字
枚举类 - 自定义枚举类与使用enum关键字
115 0
|
设计模式 JSON Java
枚举类——用好枚举真的没有那么简单!
枚举类——用好枚举真的没有那么简单!
100 0
常用的一些枚举类
常用的一些枚举类
75 0
|
Java
十 枚举类&注解
十 枚举类&注解
49 0