枚举类型(enum)

骑猪看日落 2022-05-16 06:19 416阅读 0赞

枚举类型(enum)
JDK1.5增加了枚举类型,可以使用enum来定义
例如:
public enum Gender{
MALE,FEMALE;
}
其中每一个枚举元素都是该枚举类型的一个实例,并且默认是用public static final修饰的

1)枚举类型和类的关系
把Gender.class反编译后显示如下:
public final class com.briup.test.Gender extends java.lang.Enum {
public static final com.briup.test.Gender MALE;
public static final com.briup.test.Gender FEMALE;
private static final com.briup.test.Gender[] ENUM$VALUES;
static {};
private com.briup.test.Gender(java.lang.String, int);
public static com.briup.test.Gender[] values();
public static com.briup.test.Gender valueOf(java.lang.String);
}

  1. 说明枚举类型本质还是一个类,而且默认就是fianl修饰以及默认继承父类java.lang.Enum
  2. 同时构造器是自动生成的且是私有的,表示不可再创建对象。(使用反射也不行)
  3. private Gender(String name,int ordinal)
  4. name : 枚举对象的名字
  5. ordinal: 枚举元素的编号,默认从0开始
  6. 我们在枚举中所写的MALEFEMALE其实就是Gender类型的俩个固定的对象。(public static final)

注:enum是java中的一个关键字,Enum是java中的一个类

2)获取枚举对象
1.获得枚举对象,三种方式
枚举对象在我们使用之前就已经全部创建好了,并且不会增加或减少,和声明的时候保持一致。

  1. 例如:
  2. Gender g1 = Gender.FEMALE;
  3. Gender g2 = Gender.MALE;
  4. Gender g3 = Gender.valueOf("FEMALE");
  5. Gender g4 = Gender.valueOf("MALE");
  6. System.out.println(g1 == g3);//true
  7. System.out.println(g2 == g4);//true
  8. Gender g5 = Enum.valueOf(Gender.class, "FEMALE");
  9. Gender g6 = Enum.valueOf(Gender.class, "MALE");
  10. System.out.println(g1 == g5);//true
  11. System.out.println(g2 == g6);//true
  12. 2.获得一个枚举类型的所有对象
  13. Gender\[\] values = Gender.values();
  14. for(Gender g:values)\{
  15. System.out.println(g);
  16. \}

3)枚举类型的方法
枚举对象默认只能调用到父类Enum中的方法以及Object中的方法

  1. 如果想调用自己的方法,也可以在枚举类型中定义出属于自己的方法.
  2. 注:枚举也是类,只是一种特殊的类而且,所以在枚举类型中可以定义很多东西,像之前在类中写代码是一样的
  3. 例如:
  4. public enum Gender \{
  5. MALE,FEMALE;
  6. public void say(String name)\{
  7. System.out.println("hello "+name+","+this);
  8. \}
  9. public static void main(String\[\] args) \{
  10. Gender g1 = Gender.FEMALE;
  11. Gender g2 = Gender.MALE;
  12. g1.say("tom");
  13. g2.say("tom");
  14. \}
  15. \}
  16. 也可以定义静态方法
  17. 例如:
  18. public enum Gender \{
  19. MALE,FEMALE;
  20. public void say(String name)\{
  21. System.out.println("hello "+name+","+this);
  22. \}
  23. public static void run()\{
  24. System.out.println("running..");
  25. \}
  26. public static void main(String\[\] args) \{
  27. Gender.run();
  28. \}
  29. \}

4)枚举类型的属性
枚举类型中可以定义属于自己的属性
例如:
public enum Gender {
MALE,FEMALE;

  1. private String name;
  2. public String getName() \{
  3. return name;
  4. \}
  5. public void setName(String name) \{
  6. this.name = name;
  7. \}
  8. //重写toString方法
  9. public String toString() \{
  10. return this.getName();
  11. \}
  12. public static void main(String\[\] args) \{
  13. Gender g = Gender.FEMALE;
  14. g.setName("女");
  15. System.out.println(g);
  16. \}
  17. \}

5)枚举类型的构造器
在枚举类型中定义其构造器,但是必须是私有的,默认也是私有的
例如:
public enum Gender {
//默认调用无参构造器
MALE,FEMALE;

  1. private String name;
  2. //有参构造器
  3. private Gender(String name)\{
  4. this.name = name;
  5. \}
  6. //无参构造器
  7. Gender()\{
  8. \}
  9. //重写toString方法
  10. public String toString() \{
  11. return this.name;
  12. \}
  13. \}
  14. 构造器的调用:
  15. 在声明枚举对象的时候,其实就是在调用构造器,默认是隐式调用其无参构造器,也可以显式调用有参构造器
  16. 例如:
  17. public enum Gender \{
  18. MALE("男"),FEMALE("女");
  19. private String name;
  20. private Gender(String name)\{
  21. this.name = name;
  22. \}
  23. Gender()\{
  24. this("");
  25. \}
  26. public String toString() \{
  27. return this.name;
  28. \}
  29. public static void main(String\[\] args) \{
  30. Gender g = Gender.FEMALE;
  31. System.out.println(g);
  32. \}
  33. \}

6)枚举类型的抽象方法
枚举类型中可以编写抽象方法,但是这时候其每个对象都必须去实现这个抽象方法,否则编译报错。

  1. 形式上很像匿名内部类对象
  2. 例如:
  3. public enum Gender \{
  4. MALE()\{
  5. public void run() \{
  6. System.out.println("MALE run");
  7. \}
  8. \},FEMALE()\{
  9. public void run() \{
  10. System.out.println("FEMALE run");
  11. \}
  12. \};
  13. public abstract void run();
  14. \}

7)枚举类型可以实现接口
枚举类型不能指定继承其他父类,但是可以实现其他接口

  1. 例如:枚举类型中把该接口中的所有方法实现了
  2. public interface Action\{
  3. void doSomeThing();
  4. \}
  5. public enum Gender implements Action\{
  6. MALE,FEMALE;
  7. public void doSomeThing() \{
  8. System.out.println("Gender go..");
  9. \}
  10. \}
  11. 例如:或者在每个对象中分别实现接口中所有方法也可以
  12. public interface Action\{
  13. void doSomeThing();
  14. \}
  15. public enum Gender implements Action\{
  16. MALE()\{
  17. public void doSomeThing() \{
  18. System.out.println("MALE go...");
  19. \}
  20. \},FEMALE()\{
  21. public void doSomeThing() \{
  22. System.out.println("FEMALE go...");
  23. \}
  24. \};
  25. \}

发表评论

表情:
评论列表 (有 0 条评论,416人围观)

还没有评论,来说两句吧...

相关阅读

    相关 类型enum用法赋值

    枚举常量是一种枚举类型中的值,及枚举值,枚举类型是由用户自定义的,只用用户在程序中定义它才能被使用。创建一个枚举类型的基本语法: enum 枚举类型名\{ 枚举值1,枚举值

    相关 java之类型enum

    为什么需要枚举? 一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚

    相关 (enum)类型

    关键字enum 可以将一组具名的值的有限集合创建一种新的类型,而这些具名的值可以作为常规的程序使用。创建enum 时,编译器会为你生成一个相关的类,这个类继承自java.lan

    相关 C# 类型 Enum

    枚举作用 1. 【统一】规范数据名称,让程序员【调用】数据名称,而非自己编写数据名称。 2. 耦合性高,扩展性差。修改数据只需要在枚举中修改,就可以影响全局的枚举值。