JDK源码阅读(五):Enum类

本文详细解析了Java枚举类型的内部实现,包括其作为特殊类的特性、编译及反编译过程,以及如何使用枚举类的构造器、方法和数据域。通过实例,展示了枚举类型在继承Enum类后重写的values()、valueOf()等方法的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

枚举类型

定义一个枚举类型

public enum Calculator {

    ADD,SUBSTRACT,MUTIPLE,DIVIDE;
    
}

enum很像特殊的class,实际上enum声明定义的类型就是一个类。 而这些类都是类库中Enum类的子类(java.lang.Enum)。它们继承了这个Enum中的许多有用的方法。

编译

通过javac工具将Calculator.java编译成.class文件
命令:javac Calculator.java

通过javap编译为可读字节码文件

public final class huyp.learning.jdk8.lang.Calculator extends java.lang.Enum<huyp.learning.jdk8.lang.Calculator> {
  public static final huyp.learning.jdk8.lang.Calculator ADD;

  public static final huyp.learning.jdk8.lang.Calculator SUBSTRACT;

  public static final huyp.learning.jdk8.lang.Calculator MUTIPLE;

  public static final huyp.learning.jdk8.lang.Calculator DIVIDE;

  public static huyp.learning.jdk8.lang.Calculator[] values();
    Code:
       0: getstatic     #1                  // Field $VALUES:[Lhuyp/learning/jdk8/lang/Calculator;
       3: invokevirtual #2                  // Method "[Lhuyp/learning/jdk8/lang/Calculator;".clone:()Ljava/lang/Object;
       6: checkcast     #3                  // class "[Lhuyp/learning/jdk8/lang/Calculator;"
       9: areturn

  public static huyp.learning.jdk8.lang.Calculator valueOf(java.lang.String);
    Code:
       0: ldc           #4                  // class huyp/learning/jdk8/lang/Calculator
       2: aload_0
       3: invokestatic  #5                  // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
       6: checkcast     #4                  // class huyp/learning/jdk8/lang/Calculator
       9: areturn

  static {};
    Code:
       0: new           #4                  // class huyp/learning/jdk8/lang/Calculator
       3: dup
       4: ldc           #7                  // String ADD
       6: iconst_0
       7: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      10: putstatic     #9                  // Field ADD:Lhuyp/learning/jdk8/lang/Calculator;
      13: new           #4                  // class huyp/learning/jdk8/lang/Calculator
      16: dup
      17: ldc           #10                 // String SUBSTRACT
      19: iconst_1
      20: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      23: putstatic     #11                 // Field SUBSTRACT:Lhuyp/learning/jdk8/lang/Calculator;
      26: new           #4                  // class huyp/learning/jdk8/lang/Calculator
      29: dup
      30: ldc           #12                 // String MUTIPLE
      32: iconst_2
      33: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      36: putstatic     #13                 // Field MUTIPLE:Lhuyp/learning/jdk8/lang/Calculator;
      39: new           #4                  // class huyp/learning/jdk8/lang/Calculator
      42: dup
      43: ldc           #14                 // String DIVIDE
      45: iconst_3
      46: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
      49: putstatic     #15                 // Field DIVIDE:Lhuyp/learning/jdk8/lang/Calculator;
      52: iconst_4
      53: anewarray     #4                  // class huyp/learning/jdk8/lang/Calculator
      56: dup
      57: iconst_0
      58: getstatic     #9                  // Field ADD:Lhuyp/learning/jdk8/lang/Calculator;
      61: aastore
      62: dup
      63: iconst_1
      64: getstatic     #11                 // Field SUBSTRACT:Lhuyp/learning/jdk8/lang/Calculator;
      67: aastore
      68: dup
      69: iconst_2
      70: getstatic     #13                 // Field MUTIPLE:Lhuyp/learning/jdk8/lang/Calculator;
      73: aastore
      74: dup
      75: iconst_3
      76: getstatic     #15                 // Field DIVIDE:Lhuyp/learning/jdk8/lang/Calculator;
      79: aastore
      80: putstatic     #1                  // Field $VALUES:[Lhuyp/learning/jdk8/lang/Calculator;
      83: return
}

该将语句翻译为了指令,为了看上去更简单,采用jad工具对其进行反编译,得到Calculator.java文件

反编译

命令:jad -sjava Calculator.class

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Calculator.java

package huyp.learning.jdk8.lang;


public final class Calculator extends Enum
{

    public static Calculator[] values()
    {
        return (Calculator[])$VALUES.clone();
    }

    public static Calculator valueOf(String s)
    {
        return (Calculator)Enum.valueOf(huyp/learning/jdk8/lang/Calculator, s);
    }

    private Calculator(String s, int i)
    {
        super(s, i);
    }

    public static final Calculator ADD;
    public static final Calculator SUBSTRACT;
    public static final Calculator MUTIPLE;
    public static final Calculator DIVIDE;
    private static final Calculator $VALUES[];

    static 
    {
        ADD = new Calculator("ADD", 0);
        SUBSTRACT = new Calculator("SUBSTRACT", 1);
        MUTIPLE = new Calculator("MUTIPLE", 2);
        DIVIDE = new Calculator("DIVIDE", 3);
        $VALUES = (new Calculator[] {
            ADD, SUBSTRACT, MUTIPLE, DIVIDE
        });
    }
}

总结

根据上述反编译的结果,详细介绍enum定义的枚举类的特征及其用法。

1、Calculator枚举类就是class,而且是一个不可以被继承的final类。

其枚举值(ADD,SUBSTRACT,MULTIPLE,DIVIDE)都是Calculator类型的的类静态常量,这也是枚举类的枚举值最好全部大写的原因

2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。

枚举类的构造器是私有的,在构造值时使用

3、枚举类都继承了Enum类

重写了values()、valueOf()等方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值