枚举类

枚举类入门

枚举类与普通类的区别:

  1. 枚举类可以实现一个或多个接口。枚举类默认继承java.lang.Enum类,其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。并没有默认集成Object类,因而枚举类不能显式继承其他父类。
  2. 非抽象枚举类默认使用final修饰,因而不能派生子类。抽象枚举类没有用final修饰。
  3. 枚举类的构造器只能用private修饰
  4. 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出实例时,系统会自动添加public static final修饰,无需程序员手动添加。
public enum Season {
        Spring,Summer,Autumn,Winter;
}
package FirstTime;

public class EnumTest {

    private void judge(Season s) {
        //switch语句里面的表达式可以使枚举类,case表达式中的值直接使用枚举值的名字,无需添加枚举类作为限定
        switch (s) {
        case Spring:
            System.out.println("Spring");
            break;
        case Summer:
            System.out.println("Summer");
            break;
        case Autumn:
            System.out.println("Autumn");
            break;
        case Winter:
            System.out.println("Winter");
            break;
        default:
            break;
        }
    }
    public static void main(String[] args) {
        //枚举类默认有一个values()方法,返回该枚举类的所有实例
        for (Season season : Season.values()) {
            System.out.println(season);
        }
        //使用枚举实例时,可用EnumClass.variable形式来访问
        new EnumTest().judge(Season.Spring);
    }

}

java.lang.Enum类提供了如下几个方法:
java.lang.Enum API文档

枚举类的成员变量、方法和构造器

getter、setter方法:

package FirstTime;

public enum Gender {
    MALE,FEMALE;
    private String name;
    public void setName(String name) {
        switch (this) {
        case MALE:
            if (name.equals("MAN")) {
                this.name = name;   
            } else {
                System.out.println("WRONG!");
                return;
            }
            break;
        case FEMALE:
            if (name.equals("WOMEN")) {
                this.name = name;   
            } else {
                System.out.println("WRONG!");
                return;
            }
            break;
        }
    }
    public String getName() {
        return this.name();
    }
    public static void main(String[] args) {
        Gender gender = Gender.valueOf("FEMALE");
        gender.setName("WOMEN");
        System.out.println(gender.getName());
        gender.setName("MAN");
    }
}
//public static <T extends Enum<T>>T valueOf(class<T> enumType,String name):用于返回指定枚举类中指定名称的枚举值。名称必须与在该枚举类中声明枚举值时所用的标识符完全匹配,不允许使用额外的空白字符。等价于EnumClass.variable。

构造器:

public enum Gender {
    //此处的枚举值必须调用对应的构造器来创造
    FEMALE("WOMEN"),MALE("MAN");
    private final String name ;
    //枚举类的构造器只能使用private来修饰
    private Gender(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }   
}

实现接口的枚举类

public interface GenderDesc {
    void info();
}
public enum Gender implements GenderDesc {
    //此处的枚举值必须调用对应的构造器来创造
    FEMALE("WOMEN"){
    //花括号部分实际上是一个类体部分
        public void info() {
            System.out.println("WOMEN");
        }
    },MALE("MAN"){
        public void info() {
            System.out.println("MEN");
        }
    };
    private final String name ;
    //枚举类的构造器只能使用private来修饰
    private Gender(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }   
    public static void main(String[] args) {
        Gender gender = Gender.valueOf("FEMALE");
        gender.info();
    }
}
/*当创建MALE、FEMALE枚举值时,并不是直接创建Gender枚举类的实例,而是相当于创建了Gender的匿名子类的实例。编译时可看到生成了Gender.class、Gender$1.class、Gender$2.class三个文件*/

包含抽象方法的枚举类

package ObjectOrient;

public enum Operation {
    PLUS{
        public double eval(double a, double b) {
            return a + b;
        }
    },
    MINUS{
        public double eval(double a, double b) {
            return a - b;
        }
    },
    TIMES{
        public double eval(double a, double b) {
            return a * b;
        }
    },
    DIVIDE{
        public double eval(double a, double b) {
            return a / b;
        }
    };
    //为枚举类定义一个抽象方法,由不同的枚举值实现
    public abstract double eval(double a, double b) ;
    /*枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(因为系统会自动为他添加abstract关键字),
     * 但因为枚举类需要显式创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误*/
    public static void main(String[] args) {
        System.out.println(Operation.DIVIDE.eval(3, 4));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值