JAVA中的枚举类:如何定义枚举类+枚举类的使用+枚举类中常用方法的介绍+一个枚举类的示例

2024-07-21 1658阅读

文章目录

    • JAVA中的枚举类
      • 1.什么是枚举类
      • 2.定义枚举类
      • 3.枚举类型在switch中的使用
      • 4.枚举类中的方法
      • 5.枚举类的构造器
      • 6.枚举类可以有成员
      • 7.枚举类也可以有抽象方法
      • 8.每个枚举类都有两个特殊的方法
      • 9.一个枚举类的小例子

        JAVA中的枚举类

        1.什么是枚举类

        枚举类型就是多例,一个类有多个实例,但是实例的个数不是无穷的,是有限的;枚举类中实例称为枚举项,一般一个枚举类不应该有太多的枚举项。

        2.定义枚举类

        使用enum关键字,例如

        public enum Direction{
        	FRONT,BEHIND,LEFT,RIGHT;
        }
        

        注意:定义枚举类型的关键字是enum,而不是Enum,所有关键字都是小写的

        其中 FRONT,BEHIND,LEFT,RIGHT 都是枚举项,它们都是本类的实例,也就是说本类只有四个对象

        在定义枚举项时,多个枚举项之间用逗号隔开,最后一个用分号结尾,如果枚举类型中只有枚举项(没有构造器、方法、变量),那么可以省略分号,但是不建议省。

        public enum Direction {
            FRONT,BEHIND,LEFT,RIGHT;
            private Direction(){
            }
            public void sleep(){
                
            }
        }
        

        3.枚举类型在switch中的使用

        在switch不能使用枚举类名称因为编译器会根据switch中d的类型来判断每个枚举类型,在case中必须直接给出与d相同类型的枚举项,而不能在有类型

        只需记住:在case中使用时不需要加类型

        public class DirectionTest {
            public static void main(String[] args) {
                Direction d = Direction.FRONT;
                System.out.println(d);
                switch (d){
                    case FRONT:  //枚举可以在switch中使用,不用写成Direction.FRONT
                        System.out.println("前");
                        break;
                    case BEHIND:
                        System.out.println("后");
                        break;
                    case LEFT:
                        System.out.println("左");
                        break;
                    case RIGHT:
                        System.out.println("右");
                        break;
                }
            }
        }
        

        4.枚举类中的方法

        所有枚举类默认都是Enum的子类,无需使用extends来继承,这说明Enum中的方法所有枚举类都拥有

        int compareTo()  //比较两个枚举项大小,其实就是比较枚举项在枚举类中声明的顺序
        boolean equals()  //比较两个枚举项是否相等
            
        int hashCod()  //返回枚举项的hashCode
            
        String name()  //返回枚举项的名称
            
        int ordinal()  //返回枚举项在枚举类中声明的序号,第一个枚举项的序号是0
        String toString()  //把枚举项转换成字符串
            
        static T valueOf(Class enumType,String name)  //把字符串转成枚举项
            
        

        compareTo()方法

        //例如FRONT下标是0,BEHIND下标是1,LEFT下标是2,RIGHT下标是3
        System.out.println(Direction.FRONT.compareTo(Direction.FRONT));  //0
        System.out.println(Direction.FRONT.compareTo(Direction.BEHIND));  //-1
        System.out.println(Direction.FRONT.compareTo(Direction.LEFT));  //-2
        System.out.println(Direction.FRONT.compareTo(Direction.RIGHT));  //-3
        

        equals()方法

        System.out.println(Direction.FRONT.equals(Direction.FRONT));  //true
        System.out.println(Direction.FRONT.equals(Direction.BEHIND));  //false
        

        name()方法

        System.out.println(Direction.FRONT.name());  //FRONT
        

        ordinal()方法

        System.out.println(Direction.FRONT.ordinal());  //0
        System.out.println(Direction.BEHIND.ordinal());  //1
        System.out.println(Direction.LEFT.ordinal());  //2
        System.out.println(Direction.RIGHT.ordinal());  //3
        

        toString()方法,变成字符串方便后续操作

        System.out.println(Direction.RIGHT.toString());  //RIGHT
        

        static T valueOf(Class enumType,String name)

        String s = "LEFT";
        Direction direction = Direction.valueOf(Direction.class,s);
        System.out.println(direction.getClass());
        //输出class com.test01.Direction
        

        5.枚举类的构造器

        枚举类也可以有构造器,构造器默认都是private修饰,而且只能是private修饰,因为枚举类实例不能让外界来创建

        其实创建枚举项就等于调用本类的无参构造器

        public enum Direction {
            FRONT,BEHIND,LEFT,RIGHT;
            private Direction(){
                System.out.println("我被调用了");
            }
            public void sleep(){
            }
        }
        
        public class DirectionTest {
            public static void main(String[] args) {
                Direction d = Direction.FRONT;
                System.out.println(d);
            }
        }
        

        输出结果:

        JAVA中的枚举类:如何定义枚举类+枚举类的使用+枚举类中常用方法的介绍+一个枚举类的示例

        输出4遍 “我被调用了” 因为枚举类中定义了4个枚举对象

        6.枚举类可以有成员

        枚举类与正常类一样,都可以有实例变量,实例方法,静态方法等等,只不过它的实例个数是有限的

        如果Direction类只有唯一的构造器,并且是有参的构造器,那么在创建枚举项时,必须为构造器赋值

        public enum Direction {
            FRONT("aa"),BEHIND("bb"),LEFT("cc"),RIGHT("dd");
            String name;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            Direction(String name){
                this.name = name;
            }
            public void sleep(){
            }
        }
        
        Direction d = Direction.FRONT;
        System.out.println(d.getName());
        

        7.枚举类也可以有抽象方法

        枚举类中也可以有抽象方法,创建每个枚举项时使用“特殊”的语法实现重复抽象方法即可,也就是使用匿名内部类也就是每个枚举项都是一个枚举类的匿名子类对象

        public enum Direction {
            FRONT("aa"){
                public void func(){
                    System.out.println("aa");
                }
            },BEHIND("bb"){
                public void func(){
                    System.out.println("aa");
                }
            },LEFT("cc"){
                public void func(){
                    System.out.println("aa");
                }
            },RIGHT("dd"){
                public void func(){
                    System.out.println("aa");
                }
            };
            public abstract void func();  //只需要在方法上添加abstract关键字即可,不可以把Direction声明成抽象类
        }
        

        8.每个枚举类都有两个特殊的方法

        每个枚举类都有两个不用声明就可以调用的特殊static方法,且这两个方法不是父类中的方法

        values()返回本类中的所有枚举项

        Direction[] arr = Direction.values();
        System.out.println(Arrays.toString(arr));
        //[FRONT, BEHIND, LEFT, RIGHT]
        

        valueOf(String name)通过枚举项的名字返回所有指定枚举项,注意:这个方法跟Enum类中的valueOf()方法的参数是不同的

        Direction.valueOf("LEFT").func();
        //可以调用我们之前定义的函数func
        

        9.一个枚举类的小例子

        public enum EnumDemo {
            ONE("aa","test1",33),TOW("bb","test2",66),THREE("cc","test3",99);
            private String a;
            private String b;
            private int c;
            public String getA() {
                return a;
            }
            public void setA(String a) {
                this.a = a;
            }
            public String getB() {
                return b;
            }
            public void setB(String b) {
                this.b = b;
            }
            public int getC() {
                return c;
            }
            public void setC(int c) {
                this.c = c;
            }
            EnumDemo(String a, String b, int c) {
                this.a = a;
                this.b = b;
                this.c = c;
            }
            public String toString(){
                return "EnumDemo["+
                        "a="+a+
                        ", b="+b+
                        ", c="+c+
                        "]";
            }
            //通过a对象属性获取枚举项
            public static EnumDemo fromA(String a){
                for(EnumDemo enumDemo:EnumDemo.values()){
                    if(a.equals(enumDemo.getA())){
                        return enumDemo;
                    }
                }
                return null;
            }
            //通过枚举项名称,返回枚举项
            public static EnumDemo fromName(String name){
                try{
                    return EnumDemo.valueOf(name);
                }catch(IllegalArgumentException e){
                    System.out.println("不存在");
                    return null;
                }
            }
        }
        
        public class EnumDemoTest {
            public static void main(String[] args) {
                EnumDemo enumDemo = EnumDemo.fromA("aa");
                if(enumDemo != null){
                    System.out.println(enumDemo.toString());
                }
                EnumDemo enumDemo1 = EnumDemo.fromName("ON");
                if(enumDemo1 != null){
                    System.out.println(enumDemo1.toString());
                }
            }
        }
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]