Java入门之枚举类
白羽 2018-07-09 来源 :网络 阅读 1127 评论 0

摘要:本文将带你了解Java入门之枚举类,希望本文对大家学JAVA有所帮助。


一、概念
在某些情况下,一个类的对象是有限而且固定的,例如季节类,它只有四个对象,这种实例有限而且固定的类,在Java里被称为枚举类。
手动实现枚举类:
1.通过private将构造器隐藏起来。
2.把这个类的所有可能实例都使用public static final属性来保存。
3.如果有必要,可以提供一些静态方法,允许通过特定参数来获取与之匹配的实例。

请看下面示例:

[java] view plain copy

1. package com.home;  

2.   

3. public class Season {  

4.     private final String name;  

5.     public static final Season SPRING = new Season("春天");  

6.     public static final Season SUMMER = new Season("夏天");  

7.     public static final Season FALL = new Season("秋天");  

8.     public static final Season WINTER = new Season("冬天");  

9.   

10.     // 将构造器定义为private  

11.     public Season(String name) {  

12.         super();  

13.         this.name = name;  

14.     }  

15.   

16.     // 只提供getter方法  

17.     public String getName() {  

18.         return name;  

19.     }  

20.   

21.     /** 

22.      * 提供一个静态方法获取实例 

23.      *  

24.      * @param seasonNum 

25.      * @return 

26.      */  

27.     public static Season getSeason(int seasonNum) {  

28.         switch (seasonNum) {  

29.         case 1:  

30.             return SPRING;  

31.         case 2:  

32.             return SUMMER;  

33.         case 3:  

34.             return FALL;  

35.         case 4:  

36.             return WINTER;  

37.         default:  

38.             return null;  

39.         }  

40.     }  

41. }  

二、区别
从上面的示例中可以看出手动定义枚举类是比较麻烦的,我们可以使用关键字enum来定义枚举类,枚举类与普通类的区别:
1.使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。java.lang.Enum类实现了java.lang.Serialiable和java.lang.Comparable两个接口。
2.枚举类的构造器只能使用private修饰,即使省略也默认是private的。
3.枚举类实例只能显示给出,否则永远不能产生实例,列出这些实例时,系统会自动添加public static final修饰,无需程序员显示添加。
4.所有枚举类都提供了一个values方法,用于可以很方便地遍历所有枚举值。

使用enum关键字定义的枚举类示例:

[java] view plain copy

1. package com.home;  

2.   

3. public enum Gender {  

4.     // 此处的枚举值必须调用对应的构造器来创建  

5.     MALE("男"), FEMALE("女");  

6.     private final String name;  

7.   

8.     // 枚举类的构造器只能使用private修饰  

9.     private Gender(String name) {  

10.         this.name = name;  

11.     }  

12.   

13.     // 只提供getter方法  

14.     public String getName() {  

15.         return name;  

16.     }  

17.   

18.     /** 

19.      * 提供一个静态方法获取实例对应的描述信息 

20.      *  

21.      * @param gender 

22.      * @return 

23.      */  

24.     public static String getGenderDisc(Gender gender) {  

25.         // 注意switch表达式中可以是枚举值  

26.         switch (gender) {  

27.         case MALE:  

28.             return "I am a man";  

29.         case FEMALE:  

30.             return "I am a woman";  

31.         default:  

32.             return null;  

33.         }  

34.     }  

35.   

36. }  


三、枚举类的一些常用方法介绍,请看下面测试类:

[java] view plain copy

1. package com.home;  

2.   

3. public class TestGender {  

4.   

5.     public static void main(String[] args) {  

6.         // Gender.values()列出所有枚举值  

7.         for (Gender g : Gender.values()) {  

8.             System.out.println(g);  

9.         }  

10.         // 获取实例可以直接使用EnumClass.variable形式  

11.         Gender gender = Gender.MALE;  

12.         System.out.println(Gender.getGenderDisc(gender));  

13.         // 也可以使用Enum的valueOf方法获取枚举值  

14.         System.out.println(Enum.valueOf(Gender.class, "MALE"));  

15.         // 比较枚举对象的顺序,如果该枚举对象位于指定枚举对象之前,则返回负整数-1;之后,则返回正整数1;否则返回0  

16.         System.out.println(Gender.FEMALE.compareTo(Gender.MALE));  

17.         // name方法大致和toString方法一样,返回枚举常量的名称,一般习惯用toString方法  

18.         System.out.println(Gender.MALE.name());  

19.         // ordinal()返回枚举值的索引值,第一个为0,即从0开始  

20.         System.out.println(Gender.MALE.ordinal());  

21.     }  

22.   

23. }  


四、实现接口的枚举类

其实枚举类实现接口和普通类没多少区别,也是使用implements关键字,可以实现一个或多个接口。但是需要注意的是,如果像普通类一样实现接口后直接重写接口里的方法的话,那么枚举类的所有实例就拥有一样的接口实现了,这样就失去了意义和灵活性,所以往往会为每个实例提供不同的方法实现,示例如下:

[java] view plain copy

1. package com.home;  

2.   

3. public enum Gender implements GenderDesc {  

4.     MALE("男") {  

5.         // 花括号部分实际上是一个类体部分  

6.         public void info() {  

7.             System.out.println("I am a man");  

8.         }  

9.     },  

10.     FEMALE("女") {  

11.         public void info() {  

12.             System.out.println("I am a woman");  

13.         }  

14.     };  

15.     private final String name;  

16.   

17.     // 枚举类的构造器只能使用private修饰  

18.     private Gender(String name) {  

19.         this.name = name;  

20.     }  

21.   

22.     // 只提供getter方法  

23.     public String getName() {  

24.         return name;  

25.     }  

26. }  

接口:

[java] view plain copy

1. package com.home;  

2.   

3. public interface GenderDesc {  

4.     public void info();  

5. }  


五、包含抽象方法的枚举类,枚举类中对普通方法的使用和普通类一样,这里就只介绍其抽象方法的使用,其实抽象方法跟实现接口是一个道理,这里不多说,看示例:

[java] view plain copy

1. package com.home;  

2.   

3. public enum Gender {  

4.     MALE("男") {  

5.         // 花括号部分实际上是一个类体部分  

6.         public String getInfo() {  

7.             return "I am a man";  

8.         }  

9.     },  

10.     FEMALE("女") {  

11.         public String getInfo() {  

12.             return "I am a woman";  

13.         }  

14.     };  

15.     private final String name;  

16.   

17.     // 枚举类的构造器只能使用private修饰  

18.     private Gender(String name) {  

19.         this.name = name;  

20.     }  

21.   

22.     // 只提供getter方法  

23.     public String getName() {  

24.         return name;  

25.     }  

26.   

27.     // 为枚举类定义一个抽象方法,这个抽象方法由不同枚举值提供不同实现  

28.     public abstract String getInfo();  

29. }  


注意:上面枚举类中定义了抽象方法,但是,类却没用abstract修饰,这点跟普通类不一样,因为枚举类需要显示创建枚举值,并为抽象方法提供实现,否则会出现编译错误。

 


以上就介绍了JAVA的相关知识,希望对JAVA有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言JAVA频道!





本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程