摘要:本文将带你了解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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号