首页 > 编程语言 >一文了解java枚举

一文了解java枚举

时间:2024-05-29 23:24:26浏览次数:26  
标签:java 一文 Season name 枚举 desc public String

1. 枚举的由来

当我们知道所有变量的可能性时,尽量使用枚举类型来定义,比如季节,春夏秋冬,一周(一二三四五六七),只读不需要修改
有限的一个一个列举出来的类叫做枚举类,枚举是一组常量的集合,枚举也是一个特殊的类,里面包含了一组有限的特定对象

2. 自定义实现枚举

  1. 不需要提供set方法,因为枚举对象值不能被修改(这里注意枚举一般只用于知道所有固定变量的值)
  2. 构造器私有化
  3. 枚举对象/属性用" final static""修饰
  4. 根据不同的类,生成不同数量的枚举对象,而且枚举对象定义全部大写

引用前例子

这里已知季节的所有变量是固定的春夏秋冬,可以用枚举来写

package EG.枚举的由来;

   //设置季节,春夏秋冬  
  
public class Test {  
    public static void main(String[] args) {  
        /*  
         * 秋autumn  
         * 冬winter  
         * */
        Season spring = new Season("春天","暖和");  
        Season summer = new Season("夏天","酷热");  
        Season autumn = new Season("秋天", "凉爽至极");  
        Season winter = new Season("冬天", "冰冷刺骨");  
        System.out.println(spring);  
  
    }  
}
package EG.枚举的由来;  
  
/**  
 * @author 简水君  
 */  
public class Season {  
   /** 季节的名称*/  
    private  String name;  
   /** 季节的信息*/  
    private  String desc;  
  
  
    //javaBean  
  
    public Season() {  
    }  
    public Season(String name, String desc) {  
        this.name = name;  
        this.desc = desc;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getDesc() {  
        return desc;  
    }  
  
    public void setDesc(String desc) {  
        this.desc = desc;  
    }  
  
    @Override  
    public String toString() {  
        return   name+"的特点: "+desc;  
    }  
}

引用后例子

package EG.枚举的由来.引用后;  
  
   //设置季节,春夏秋冬  
  
public class Test {  
    public static void main(String[] args) {  
  
        System.out.println(Season.SPRING);  
        System.out.println(Season.SUMMER);  
        System.out.println(Season.SPRING);  
        System.out.println(Season.WINTER);  
    }  
}

这里模拟Season类继承enum类称为枚举类,其次是季节都是固定的值,不能再次创建也不能修改,将构造器私有化,把set方法删除,创建静态对象

package EG.枚举的由来.引用后;  
  
/**  
 * @author 简水君  
 */  
public class Season {  
    /**  
     * 季节的名称  
     */  
    private String name;  
    /**  
     * 季节的信息  
     */  
    private String desc;  
  
    //javaBean  
  
    /** 这里模拟Season类继承enum类称为枚举类 */  
  
	public final static Season SPRING = new Season("春天", "暖和");  
	public final static Season SUMMER = new Season("夏天", "酷热");  
	public final static Season AUTUMN = new Season("秋天", "凉爽至极");  
	public final static Season WINTER = 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 name + "的特点: " + desc;  
    }  
}

3.枚举的使用

定义枚举用名词enum ,第一行只能是常量(最终静态/类的对象的缩写),多个常量用逗号分隔,后面行随意
格式:

  1. 无参时: 变量名1,变量名2,变量名3; 等价于 变量n()
  2. 有参时; 变量名1(实参),变量名2(实参),变量名3(实参);
package EG.b枚举的使用;  

/**  
* @author 简水君  
*/  
 
 
//设置季节,春夏秋冬  
 
public class Test {  
   public static void main(String[] args) {  
 
       System.out.println(Season.SPRING);  
       System.out.println(Season.SUMMER);  
       System.out.println(Season.SPRING);  
       System.out.println(Season.WINTER);  
 
   }  
}  
 
enum Season {  
    //这里季节都是固定的值把set方法删除  
/* 这里 SPRING("春天", "暖和")相当于 public final static Season SPRING = new Season("春天", "暖和");  假设有个无参常量 SPRING,也是等价于SPRING()的*/
   SPRING("春天", "暖和"),SUMMER("夏天", "酷热"),AUTUMN("秋天", "凉爽至极"),WINTER("冬天", "冰冷刺骨");  
 
   //javaBean  
   /**  
    * 季节的名称  
    */  
   private String name;  
   /**  
    * 季节的信息  
    */  
   private String desc;  
   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 name + "的特点: " + desc;  
   }  
}

4.反编译enum类

这里 底层将该季节类Season为最终类,不能被继承且继承了Enum接口,有其方法values(),valueOf(),还有一个静态代码块

练习题

这里BOY,GIRL都是创建了无参的常量对象,这里输出boy指的是Boy的对象(类加载时加载一次静态最终常量),但这里没有重写Enum的toString()方法,所以指的是其常量名字,两个引用指向一个对象

5.枚举enum的方法

package EG.c枚举方法的使用;  
  
import java.util.Arrays;  
  
/**  
 * @author 简水君  
 */  
public class Test {  
    public static void main(String[] args) {  
        Season sp = Season.SPRING;  
        // 1. toString()这里返回的是枚举对象的名字 SPRING        System.out.println(sp);  
        // 2. name()这里返回的也是枚举对象的名字 SPRING        System.out.println(sp.name());  
        // 3.返回的是枚举对象的索引位置 0 , 可以用于comparable比较  
        System.out.println(sp.ordinal());  
        // 4. values() 这里返回的是一个枚举的所有常量的数组  
        Season[] values = Season.values();  
        System.out.println(Arrays.toString(values));  
        // for( Season s :  values ){}  
  
        // 5. valueOf(" ")获取包含字符串的常量对象  
        Season sa = Season.valueOf("WINTER");  
        System.out.println(sa);  
  
        // 6.CompareTo: 比较两个枚举常量,比较的是编号的差值,底层是两者调用ordinal方法的差值,这可以算出两个常量位置的差值  
        //春天和冬天的差值0-3  
        int i = Season.SPRING.compareTo(Season.WINTER);  
        System.out.println(i);  
  
    }  
}  
  
enum Season {  
    SPRING("春天", "暖和"), SUMMER("夏天", "酷热"), AUTUMN("秋天", "凉爽至极"), WINTER("冬天", "冰冷刺骨");  
    private String name;  
    private String desc;  
  
    private Season() {  
    }  
    private Season(String name, String desc) {  
        this.name = name;  
        this.desc = desc;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public String getDesc() {  
        return desc;  
    }  
  
}

例子

package EG.d练习题;  
  
import java.util.Arrays;  
import java.util.PropertyResourceBundle;  
  
/**  
 * @author 简水君  
 */  
public class Test {  
    public static void main(String[] args) {  
    //获取所有的常量数组,遍历  
        Week[] values = Week.values();  
        System.out.println("所有星期信息如下: ");  
        for (Week value : values) {  
            System.out.print(value+" ");  
        }  
    }  
}  
  
/**  
因为我们知道一周所有变量固定的值,所以用枚举来写,而且各个变量不给改变,  
 而且定义的Week的是最终类,不给继承,但可以创建对象  
*/  
enum Week{  
    MONDAY("周一"),TUESDAY("周二"),WEDNESDAY("周三"),THURSDAY("周四"),FRIDAY("周五"),SATURDAY("周六"),SUNDAY("周末");  
  
    private  String name;  
  
  
   private Week() {  
    }  
    private Week(String name) {  
        this.name = name;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    @Override  
    public String toString() {  
        return name;  
    }  
}

6.枚举实现接口

  1. 使用enum关键字后,就不能再继承其他类了,但enum定义的类底层会继承Enum接口,这算是java的单继承机制了
  2. 枚举类和普通类一样,可以实现接口,如下形式 enum 类名 implements 接口1,接口2{} ,多几个义父
package EG.e枚举实现接口;  
  
public class Test {  
    public static void main(String[] args) {  
  
    //    调用枚举的方法  
        Music.GUANGHUISUIYUE.play();  
    }  
}  
  
enum  Music implements Play{  
    //定义一个音乐对象  
    GUANGHUISUIYUE;  
  
    @Override  
    public void play() {  
        //打印常量的名称  
        System.out.println("正在播放

标签:java,一文,Season,name,枚举,desc,public,String
From: https://www.cnblogs.com/xwdzj/p/18221334

相关文章

  • 前端学习笔记——JavaScript基础语言的学习(三)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1,类型转换:把一种数据类型的变量转换成......
  • 前端学习笔记——JavaScript基础语言的学习(二)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1.数组的基本使用2.常量的基本使用......
  • Java浅拷贝大揭秘:如何轻松复制两个不同对象的某些相同属性
    哈喽,大家好,我是木头左!一、引言在Java编程中,经常会遇到需要复制一个对象的属性到另一个对象的情况。这时,可以使用浅拷贝(ShallowCopy)来实现这个需求。那么,什么是浅拷贝呢?浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中。这样,新对象和原对象就会有相同的字段......
  • JAVA每日作业day5.29
    依旧是活力满满的一天奥老铁们。今天学习了数组,数组包括了以下方面:1.动态初始化:自己定义数组的长度,系统决定初始值。2.静态初始化:自己决定数组的初始值,系统决定长度。3.数组的的索引:索引从0开始并逐一增加(每次加1),我们要存储数组的数据时,要用索引来存储,话不多说上代码。......
  • java中String、List、数组之间的转换方式
    在Java中,String、List和数组(如String[])之间的转换是常见的操作。下面是如何在它们之间进行转换的示例。1.String转List通常,你不会直接将一个完整的String转换为List,但你可以将包含多个元素的字符串(如由逗号分隔的字符串)分割成多个部分,并将这些部分添加到List中。Str......
  • 5.29_Java程序流程控制
    CSDN   同C语言的流程同1、补充:1、switch使用时的注意事项1、表达式只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、longswitch里面是做分支匹配,也就是可以出现很多分支,如果弄得范围很大,不可能出现这么多分支,int的范围都很......
  • Java数据结构与算法(红黑树)
    前言红黑树是一种自平衡二叉搜索树,确保在插入和删除操作后,树的高度保持平衡,从而保证基本操作(插入、删除、查找)的时间复杂度为O(logn)。实现原理红黑树具有以下性质:每个节点要么是红色,要么是黑色。根节点是黑色的。每个叶子节点(NIL节点,通常是空节点)是黑色的。如果一个节点......
  • Java数据结构与算法(散列表)
    前言散列表是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。而key的冲突主要通过链表的方式来处理,后期链表过长情况下可以通过红黑树来优化查询效率。实现原理散列函数(HashFunction):散列函数......
  • Java数据结构与算法(B+树)
    前言B+树(B+Tree)是一种平衡树数据结构,广泛用于数据库和文件系统中。它是一种自平衡的树结构,每个节点包含多个键,并且所有键都是排序的。B+树的叶子节点包含指向相邻叶子节点的指针,这使得范围查询非常高效。B+树的优点1.由于B+树在非叶子结点上不包含真正的数据,只当做索引使用......
  • Erroe:JSON parse error: Cannot deserialize value of type `java.lang.Integer` from
    报错:JSONparseerror:Cannotdeserializevalueoftype`java.lang.Integer`fromObjectvalue(token`JsonToken.START_OBJECT`);nestedexceptioniscom.fasterxml.jackson.databind.exc.MismatchedInputException:Cannotdeserializevalueoftype`java.lang.I......