Java枚举详解

enum修饰的类默认继承了Enum类,默认被static final修饰。因为Java不支持多继承,故枚举类不能继承其他类;因为该枚举默认被final修饰,所以枚举也不能被其他类继承。
枚举最简单的应用就是定义一组常量:

package enemerated;
enum Season {
    SPRING, 
    SUMMER, 
    FALL, 
    WINTER
}

public class EnumClass {
    public static void main(String[] args) {
        System.out.println(Season.SPRING);  //SPRING
        System.out.println(Season.SUMMER);  //SUMMER
        System.out.println(Season.FALL);  //FALL
        System.out.println(Season.WINTER);  //WINTER
    }
}

枚举中的元素默认被public static final修饰。实际上,在JDK1.5之前,我们定义常量都是:public static final ...,引入枚举之后,我们就可以使用枚举来替代以前常量定义的方式。

向枚举中添加方法
package enemerated;
enum Season {
    SPRING(1, "春天"), 
    SUMMER(2, "夏天"), 
    FALL(3, "秋天"), 
    WINTER(4, "冬天");
    
    private int index;
    private String name;
    
    private Season(int index, String name) {
        this.index = index;
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class EnumClass {
    public static void main(String[] args) {
        System.out.println(Season.SPRING.getName());  //春天
        Season.SPRING.setName("改变春天");
        System.out.println(Season.SPRING.getName());  //改变春天
    }
}

枚举元素因为默认被public static final修饰,所以枚举元素一旦定义好是不能改变的,但是枚举元素后面的描述信息是可以改变的,以上的例子中,我们就把“春天”改变成了“改变春天”。
枚举元素中的构造器只能用private修饰,这是为了防止被外部调用构造器去创建对象而造成重复。

枚举元素中可以重写枚举定义中的方法

枚举定义中可以定义方法和抽象方法,在枚举元素中可以重写这些方法:

package enemerated;
enum Season {
    SPRING(1, "春天"){
        @Override
        protected void show() {
            
        }
    }, 
    SUMMER(2, "夏天") {
        @Override
        protected void show() {
            
        }
    }, 
    FALL(3, "秋天") {
        @Override
        protected void show() {
            
        }
    }, 
    WINTER(4, "冬天") {
        @Override
        protected void show() {
            
        }
        protected void say() {
            System.out.println("我是冬天");
        }
    };
    
    private int index;
    private String name;
    
    private Season(int index, String name) {
        this.index = index;
        this.name = name;
    }
    
    abstract protected void show();
    protected void say() {
        System.out.println("我是季节");
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class EnumClass2 {
    public static void main(String[] args) {
        Season.SPRING.say();  //我是季节
        Season.WINTER.say();  //我是冬天
    }
}

从这里可以看出,枚举元素实际上可以看成枚举类的子类。

你可能感兴趣的:(Java枚举详解)