枚举的原理及使用

枚举

锁定了取值范围的数据类型
枚举其实就是静态常量
注意问题
1.枚举常量直接用逗号隔开,最后分号可写可不写,如果后边有代码,必须加分号
2. 枚举只能包含私有构造方法,属性和普通方法,必须写在常量后边

枚举类型可以看做我们平时新建.java差不多,只是枚举类限制了此类的实例对象。

原理解析

public enum  Season {
    SPRING,SUMMER,AUTUMN,WINTER;
    public static void main(String[] args) {
        // 获取方式
        // 1.valueof方法 获取枚举类型
        Season summer = Season.valueOf("SUMMER");
        System.out.println(summer);
        // 2.直接初始化
        Season summer1 = Season.SUMMER;
    }
}

在这里插入图片描述
通过反编译可以发现:
枚举本身就是一个继承于Enum类的final类
其各个枚举常量就是final类的静态常量对象,他们在静态代码块中完成创建
不写构造方法时会 默认的构造方法会调用父类的构造方法

使用

为枚举常量添加属性

想要添加属性,必须要先定义属性,并重写私有构造方法(属性赋值),能获取属性的公开方法

public enum  Season {
    SPRING("春天"),
    SUMMER("夏天"),
    AUTUMN("秋天"),
    WINTER("冬天");
    // 常量的属性
    private String attr;
    // 覆盖构造造方法,为常量添加属性
    private Season(String attr){
        this.attr = attr;
    }
    // 属性获取
    public String getAttr(){
        return attr;
    }
    public static void main(String[] args) {
        Season summer = Season.SUMMER;
        System.out.println(summer);
        // 获得属性值
        String attr = Season.SUMMER.getAttr();
        System.out.println(attr);
    }
}

输出 :
summer
夏天

在这里插入图片描述
我们添加的私有构造方法,属性,获取属性方法都是为了在我们定义枚举常量时为其赋值。

我们反编译发现,覆盖的构造方法会调用父类的构造方法,在静态代码块中为枚举常量附上我们自定义的属性,之后我们可以通过get方法在外部获得这些静态常量的属性

单例模式

反编译发现,枚举的实现完全符合单例的构建步骤:
1.在类内部定义一个实例
2.私有化构造方法
3.定义一个公开方法获得返回值

public enum  SingleTon {
    SINGLE_TON;
    public static void main(String[] args) {
        // 获得的对象是单例
        SingleTon singleTon = SingleTon.SINGLE_TON;
    }
}
Switch支持枚举
重写toString

默认输出name属性,即枚举常量名

枚举中的抽象方法

反编译过后可以发现,枚举类不可继承别的类,因为其已经默认继承Enum类,也不可能被其他类继承,因为其本身就是fianl类

但其中可定义抽象方法,枚举常量本身就是该类的实例对象,故每个枚举类都要实现这个抽象方法,可用于给枚举常量增加功能;

如下,利用抽象方法给枚举常量增加了指向下一个枚举常量的功能

public enum TrafficLamp {
    RED(30) {
        @Override
        public TrafficLamp getNextLamp() {
            return GREEN;
        }
    }, GREEN(45) {
        @Override
        public TrafficLamp getNextLamp() {
            return YELLOW;
        }
    }, YELLOW(5) {
        @Override
        public TrafficLamp getNextLamp() {
            return RED;
        }
    };

    private int time;
    public int getTime(){
        return time;
    }
    private TrafficLamp(int time) {
        this.time = time;
    }

    //一个抽象方法
    public abstract TrafficLamp getNextLamp();

    public static void main(String[] args) {
        TrafficLamp red = TrafficLamp.RED;
        System.out.println(red.getTime());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值