枚举类学习

  1. 什么是枚举类?
    类的实例个数是有限的,但又不是很多。
  2. JDK1.5之前如何定义枚举类?
package com.prosay.demo1;

/**
 * 季节的枚举类
 * 某个类的实例个数有限(说明类的构造方法不能随意被外部调用),但又不是很多。
 * JDK1.5之前如何自定义枚举类
 * JDK1.5之后才有Enum
 * @author may
 *
 */
public class Season {

    //3.如何得到这个类的实例?实例个数设置为类的常量
    public final static Season SPRING =new Season("春天",1);
    public final static Season SUMMER =new Season("夏天",2);
    public final static Season FAIL =new Season("秋天",3);
    public final static Season WINTER =new Season("东天",4);

    //2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
    private final String name;
    private final int value;
    //1.私有化构造方法
    private Season(String name,int value) {
        this.name=name;
        this.value=value;
    }

    //4.需要get,set方法么?不需要set,需要get
    public String getName() {
        return name;
    }
    public int getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Season [name=" + name + ", value=" + value + "]";
    }


}

3.JDK1.5之后如何定义枚举类?

package com.prosay.demo1;

/**
 * JDK1.5后声明枚举类
 * 
 * @author may
 *
 */
public enum SeasonEnum {

    // 3.如何得到这个类的实例?实例个数设置为类的常量
    SPRING("春天", 1), SUMMER("夏天", 2), FAIL("秋天", 3), WINTER("东天", 4);

    // 2.属性(季节名,季节序号),类的实例不允许修改,实例的属性也不允许修改
    private final String name;
    private final int value;

    // 1.私有化构造方法
    private SeasonEnum(String name, int value) {
        this.name = name;
        this.value = value;
    }

    // 4.需要get,set方法么?不需要set,需要get
    public String getName() {
        return name;
    }

    public int getValue() {
        return value;
    }

}

4.自定义枚举类和使用Enum声明的枚举类有什么区别?
       使用Enum声明的枚举,反编译后发现是final修饰的class,所以他不可以有子类,默认继承java.lang.Enum类,所以使用Enum声明的枚举不能再继承其他类,java中不允许多继承。而用class自定义的枚举类可以继承另外一个类,还可以实现其它接口。

5.枚举类和常量类有什么区别?

package com.prosay.demo1;

/**
 * 既然编译后的Enum类中使用的实质是常量,那么Enum类和常量类的区别是什么?
 * 
 * @author may
 *
 */
public class Test {

    public final static String SPRING = "春天";
    public final static String SUMMER = "夏天";
    public final static String FAIL = "秋天";
    public final static String WINTER = "东天";

    public static void main(String[] args) {

        Season s1 = Season.SPRING;
        System.out.println(s1);

        s1 = Season.SUMMER;

        SeasonEnum sEnum = SeasonEnum.WINTER;
        System.out.println(sEnum);

        fun("东边");// 使用其他类型无法控制实参取值
        // fun2("东边"); 编译的时候就能够检测到实参是否合法
        fun2(SeasonEnum.SPRING);
    }

    public static void fun(String s) {
        System.out.println(s);
    }

    // 使用枚举作为形式参数,可以控制调用方法时传递的实际参数的值
    public static void fun2(SeasonEnum s) {
        System.out.println(s);
    }

}

6.枚举底层的实现原理?
       可通过反编译来查看底层实现原理:
这里写图片描述

7.枚举类的常用方法有哪些?

package com.prosay.demo1;

/**
 * 枚举类中有哪些常用方法?
 * 
 * @author may
 *
 */
public class TestEnumMethod {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DirectionEnum dEnum = DirectionEnum.valueOf("UP");
        System.out.println(dEnum);
        dEnum = dEnum.valueOf(DirectionEnum.class, "LEFT");
        System.out.println(dEnum);

        System.out.println(DirectionEnum.getInfo());
        System.out.println(DirectionEnum.getEnumByDesc("向左"));
        // System.out.println(DirectionEnum.getInfo());
    }

}

enum DirectionEnum {
    UP("向上", 1), DOWN("向下", 2), LEFT("向左", 3), RIGHT("向右", 4);
    private final String desc;
    private final int value;

    private DirectionEnum(String desc, int value) {
        this.desc = desc;
        this.value = value;
    }

    public String toString() {
        return desc + "_" + value;
    }

    // 如何获取枚举类中所有枚举值
    public DirectionEnum[] getAllDirectionEnum() {
        return DirectionEnum.values();
    }

    public static String getInfo() {
        StringBuffer sb = new StringBuffer();
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            sb.append(d.toString()).append("#");
        }
        return sb.toString();
    }

    public int getValue() {
        return this.value;
    }

    public String getDesc() {
        return this.desc;
    }

    // 通过枚举值得某个属性获取枚举对象,比如由1得到运动方向值
    public static DirectionEnum getEnumByValue(int value) {
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            if (d.getValue() == value) {
                return d;
            }
        }

        throw new IllegalArgumentException("没有这个方向,参数异常!");
    }

    public static DirectionEnum getEnumByDesc(String desc) {
        DirectionEnum[] ds = DirectionEnum.values();
        for (DirectionEnum d : ds) {
            if (d.getDesc().equals(desc)) {
                return d;
            }
        }

        throw new IllegalArgumentException("没有这个方向的描述,参数异常!");
    }
}

8.switch语句后面可以使用哪些数据类型?

package com.prosay.demo1;

/**
 * switch语句后面可以是什么数据类型? byte,short,char,int (这些类型都可以自动转换为int类型) 
 * JDK1.5以后可以是enum(ordinal,该方法实际上是返回一个int类型的数组)
 * JDK1.7以后是String (常量池,实际上也是转换为整数进行处理)
 * 
 * @author may
 *
 */
public class TestSwitchUseEnum {

    public static void main(String[] args) {

        SeasonEnum seasonEnum = SeasonEnum.SPRING;

        switch (seasonEnum) {

        case SPRING:
            System.out.println("春天来了,你可以种个对象了!");
            break;
        case SUMMER:
            System.out.println("夏天来了,你可以去游泳了!");
            break;
        case FAIL:
            System.out.println("秋天来了,你可以收获对象了!");
            break;
        case WINTER:
            System.out.println("栋天来了,你可以找个对象了!");
            break;
        default:
            break;
        }
        int order = seasonEnum.ordinal();
        System.out.println(order);

    }

}

9.如何利用枚举一句话实现单列模式?

package com.prosay.demo1;

public enum A {
    INSTANCE;
    public void say() {
        System.out.println("666");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值