Java枚举类

枚举类

枚举类的对象是有限而且固定的。
使用enum 关键词定义。
枚举类是一种特殊的类

  1. 枚举类可以实现一个或多个接口,不能显式的继承其他父类。 因为使用 enum 定义的枚举类默认继承了java.lang.Enum 类, java.lang.Enum 实现了 Comparable, Serializable 两个接口
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {
}
  1. 使用 enum 定义、非抽象的枚举类默认使用final修饰符, 因此枚举类不能派生子类。
  2. 枚举类的构造器只能用 private访问控制符, 默认为 private。
  3. 枚举类的所有实例必须在枚举类第一行显式列出,否则这个枚举类不能产生实例,这些实例系统自动加上public static final修饰。
  4. 一个JAVA源文件最多只能定义一个public访问权限的枚举类,且源文件名称和枚举类名相同。
  5. 枚举类默认提供一个 values() 方法,方便遍历所有的枚举值。
public enum EnumTest {
    GOOD,BAD;
}

class EnumTestObj{
    public void judge(EnumTest s){
        switch (s){
            case GOOD:
                System.out.println("very good");
                break;
            case BAD:
                System.out.println("very bad");
                break;
        }
    }


    public static void main(String[]  args){
        for (EnumTest s : EnumTest.values()){
            System.out.println(s);
        }

        EnumTestObj enumTestObj = new EnumTestObj();
        enumTestObj.judge(EnumTest.GOOD);
        //比较枚举对象顺序
        System.out.println(EnumTest.GOOD.compareTo(EnumTest.BAD));
        //枚举值的索引值
        System.out.println(EnumTest.BAD.ordinal());
    }
}

//输出
GOOD
BAD
very good
-1
1

switch表达式可以是任何枚举类型, case表达式可以直接使用枚举值名字。

枚举类成员变量,方法,构造器

枚举类可以定义成员变量, 方法和构造器。
枚举类的实例只能是枚举值, 而不是随意通过 new 创建对象

public enum Gender {
    MALE("男"),FEMALE("女");

    private final String name;

    private Gender(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

}
class GenderTest{
    public static void main(String[] args){
        Gender gender = Gender.valueOf("MALE");
        System.out.println(gender + " 代表 ;" + gender.getName());
    }
}

//输出
MALE 代表 ;男

实现接口

枚举类可以实现一个或多个接口。

interface GenderDesc{
     void info();
}
public enum Gender implements GenderDesc {
    MALE("男"),FEMALE("女");

	//实现接口方法
    public void info(){
        System.out.println("desc");
    }
    private final String name;

    private Gender(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

}

如果每个枚举值调用该方法时,要呈现不同的操作,则可以让每个枚举值分别定义。

interface GenderDesc{
     void info();
}
public enum Gender implements GenderDesc {
    MALE("男"){
        @Override
        public void info() {
            System.out.println("male info");
        }
    },
    FEMALE("女"){
        @Override
        public void info() {
            System.out.println("female info");
        }
    };
    
    private final String name;

    private Gender(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

上面这种方式,{}相当于创建Gender的匿名子类的实例。

包含抽象方法的枚举类

枚举类定义抽象方法时,不能使用 abstract 关键字将枚举类定义成抽象类, 因为系统会自动加上 abstract 。
因为枚举类需要显式的创建枚举值,而不是父类,所以每个枚举值必须为抽象方法提供实现。

public enum  Operation {
    PLUS{
        @Override
        public int eval(int a, int b) {
            return a + b;
        }
    },
    MINUS{
        @Override
        public int eval(int a, int b) {
            return a - b;
        }
    };
	//定义一个抽象方法,
	//每个枚举值都提供不同的实现
    public abstract int eval(int a, int b);

    public static void main(String[] args){
        System.out.println(Operation.PLUS.eval(5, 4));
        System.out.println(Operation.MINUS.eval(5, 4));
    }
}

//输出
9
1

地址: https://blog.csdn.net/yonggang7/article/details/86726534

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值