java枚举enum的使用

本文介绍了Java中枚举类型的定义及使用方法,解析了枚举类型的底层实现原理,并展示了如何自定义枚举属性和方法。

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

一、什么是枚举

java中定义枚举类型使用enum关键字,是为了替代使用static final的一中可选的用法,比起直接使用static final,使用枚举更加方便。看如下代码:

package cn.mike;

public enum EnumTest {
MON,TUE,WED,THU,FRI,SAT,SUN;

public static void main(String[] args) {
System.out.println(EnumTest.FRI);
}
}

可以在测试类中EnumTest.MON使用即可。


二、原理解析

枚举类型结果编译器解析以后其实就是一个class final 类型,例如如下代码:

enum AccountType
{
    SAVING, FIXED, CURRENT;
    private AccountType()
    {
        System.out.println(“It is a account type”);
    }
}

经过对编译后的class反编译以后,得到一个类public final class AccountType extends java.lang.Enum<EnumTest>,所有的枚举类型的父类都是
java.lang.Enum<? extends Enum>,如下枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,原先的枚举类型变成
对应的实体类型,上例中AccountType变成了个class AccountType,并且会生成一个新的构造函数,若原来有构造函数,则在此基础上添加两个参数,生成新的构造函数,如上例子中:
1
private AccountType(){ System.out.println(“It is a account type”); }
会变成:
1
2
private AccountType(String s, int i){
    super(s,i); System.out.println(“It is a account type”); }
而在这个类中,会添加若干字段来代表具体的枚举类型:
1
2
3
public static final AccountType SAVING;
public static final AccountType FIXED;
public static final AccountType CURRENT;

而且还会添加一段static代码段:
1
2
3
4
5
6
static{
    SAVING = new AccountType("SAVING"0);
    ...  CURRENT = new AccountType("CURRENT"0);
   $VALUES = new AccountType[]{
         SAVING, FIXED, CURRENT
    } }
以此来初始化枚举中的每个具体类型。(并将所有具体类型放到一个$VALUE数组中,以便用序号访问具体类型)

三、自定义枚举属性和方法

package cn.mike;


public enum EnumTest2 {
MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6){ //相当于匿名内部类,重载父类的isRest()方法


@Override
public boolean isRest() {
return true;
}
},
SUN(0){


@Override
public boolean isRest() {
return true;
}

};

public static void main(String[] args) {
System.out.println(EnumTest2.FRI);
}

int value;

private EnumTest2(int value) {
this.value = value;
}


public int getValue() {
return value;
}


public void setValue(int value) {
this.value = value;
}

public boolean isRest(){
return false;
}
}
   其实枚举中的每一个属性,例如上例子中的MON(1),TUE(2),WED(3),THU(4),FRI(5),SAT(6)在解析成class对象以后,都是一个static final EnumTest2 
的对象,我们在其中定义的属性和方法就可以通过EnumTest2.MON.getValue()来访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值