枚举类专题(有源代码)

简介:JDK1.5之前需要自定义枚举类,JDK1.5新增的enum关键字用于定义枚举类,若枚举只有一个成员,则可以作为一种单例模式的实现方式

枚举类的属性:枚举类对象的属性不应允许被改动,所以应该使用private final修饰

·枚举类的使用private final修饰的属性应该在构造器中为其赋值

·若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数

Enum枚举类:

·必须在枚举类的第一行声明枚举类对象。

·枚举类和普通类的区别:

  1.使用enum定义的枚举类默认继承了java.lang.Enum类

  2.枚举类的构造器只能使用private访问控制符

  3.枚举类的所有实例必须在枚举类中显式列出(,分隔 ;结尾)列出的实例系统会自动添加public static final 修饰

·JDK 1.5 中可以在switch表达式中使用Enum定义的枚举类的对象作为表达式,case 子句可以直接使用枚举值的名字,无需添加枚举类作为限定

·枚举类的主要方法:

1.values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

2.valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。

 实现接口的枚举类:

·和普通java类一样,枚举类可以实现一个或多个接口

·若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法

下面是最关键的:代码

  1 package com.demo;
  2 /*
  3  * 一、自己定义
  4  * 二、使用enum关键字定义枚举类
  5  * 1.常用的方法
  6  * 2.如何让枚举类实现接口
  7  */
  8 public class TestSeason {
  9     public static void main(String[] args) {
 10         //1.values()的用法 返回所有 枚举类的对象
 11         SeasonEnum[] values = SeasonEnum.values();
 12         for (int i = 0; i < values.length; i++) {
 13                     values[i].showMe();
 14         }
 15         //2.valueOf(String name):要求传入的形参name是枚举类对象的名字,
 16         //否则,报java.lang.IllegalArgumentException异常
 17         String str = "SUMMER";
 18         SeasonEnum season= SeasonEnum.valueOf(str);
 19         season.showMe();
 20         System.out.println(season);
 21         //3.getDeclaringClass()这个方法得到枚举常量所属枚举类型的Class对象
 22         //可以用它来判断两个枚举常量是否属于同一个枚举类型
 23         System.out.println(season.getDeclaringClass());
 24         //4.ordinal() 得到当前枚举常量的次序
 25         System.out.println(season.ordinal());
 26         //toString()方法  可以重写,使结果更好看
 27         //equals()在枚举类型中可以直接使用“==”来比较两个枚举常量是否相等。Enum提供的这个equals()方法,
 28         //也是直接使用“==”实现的。它的存在是为了在Set、List和Map中使用。注意,equals()是不可变的。
 29         //hashcode   Enum实现了hashCode()来和equals保持一致。它也是不可变的。
 30         //compareTo 枚举类型实现了comparable 接口,这样可以比较两个枚举常量的大小(按照声明的顺序排列)
 31         //clone 枚举类型不能被clone。为了防止子类实现克隆方法,enum实现了一个仅抛出clonenotsupportedexception异常的不变clone().
 32     }
 33 }
 34 //枚举类,自己定义的,不是官方的,反正功能都一样
 35 class Season{
 36     //1.提供类的属性,声明为private final
 37     private final String seasonName;
 38     private final String seasonDesc;
 39     //2.声明为final的属性,在构造器中初始化
 40     private Season(String seasonName,String seasonDesc){
 41         this.seasonName = seasonName;
 42         this.seasonDesc = seasonDesc;
 43     }
 44     //3.通过公共的方法来调用属性
 45     public String getSeasonName() {
 46         return seasonName;
 47     }
 48 
 49     public String getSeasonDesc() {
 50         return seasonDesc;
 51     }
 52     //4.创建枚举类的对象
 53     public static final Season SPRING = new Season("spring", "春暖花开");
 54     public static final Season SUMMER = new Season("summer", "夏日炎炎");
 55     public static final Season AUTUMN = new Season("autumn", "秋高气爽");
 56     public static final Season WINTER = new Season("winter", "白雪皑皑");
 57     
 58     @Override
 59     public String toString() {
 60         return "Season [seasonName=" + seasonName + ", seasonDesc=" + seasonDesc + "]";
 61     }
 62     public void show(){
 63         System.out.println("这是一个季节");
 64     }
 65     
 66 }
 67 //泛型类,这个是系统提供
 68 enum SeasonEnum implements Info{
 69     //这个得放在第一行
 70     SPRING ("spring", "春暖花开"){
 71         public void showMe(){
 72             System.out.println("我叫春天!");
 73         }
 74     },
 75     SUMMER ("summer", "夏日炎炎"){
 76         public void showMe(){
 77             System.out.println("我叫夏天!");
 78         }
 79     },
 80     AUTUMN ("autumn", "秋高气爽"){
 81         public void showMe(){
 82             System.out.println("我叫秋天!");
 83         }
 84     },
 85     WINTER ("winter", "白雪皑皑"){
 86         public void showMe(){
 87             System.out.println("我叫冬天!");
 88         }
 89     };
 90         
 91     private final String seasonName;
 92     private final String seasonDesc;
 93     
 94      private SeasonEnum(String seasonName,String seasonDesc) {
 95         this.seasonName = seasonName;
 96         this.seasonDesc = seasonDesc;
 97     }
 98 
 99     public String getSeasonName() {
100         return seasonName;
101     }
102 
103     public String getSeasonDesc() {
104         return seasonDesc;
105     }
106     @Override
107     public String toString() {
108         return this.getSeasonName()+":"+this.getSeasonDesc();
109     }
110 
111     public void showMe() {
112         
113     }
114 
115 }
116 //泛型类 要实现的接口
117 interface Info {
118     void showMe();
119 }
原文地址:https://www.cnblogs.com/liangxiaoyu/p/5119048.html