java枚举

枚举

枚举是一种常量的集合。(枚举是一种特殊的类,里面只包含一组有限的特定的对象)

自定义实现枚举

1.构造器私有化 防止直接new出来
2.去掉set方法
3.在该类内部创建固定的对象
4.枚举对象名通常需要全部大写

public class enumtion01 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUMN);
    }
}

class Season{
    private String name;
    private String desc;
    //4个 static 对象  所以可以用 Season.AUTUMN 访问 优化 + final
    //static+final 不会类加载  但是 此处new Season() 类加载 而且创建了对象
    //此处加final 没啥用
    public final static Season SPRING = new Season("春天","温暖");
    public final static Season WINTER = new Season("冬天","寒冷");
    public final static Season AUTUMN = new Season("秋天","凉爽");
    public final static Season SUMMER = new Season("夏天","炎热");

    private Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
        System.out.println("构造器初始化:name"+name+"desc :"+desc);
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum 关键字

使用实例
public class enumtion02 {
    public static void main(String[] args) {
        System.out.println(Season02.AUTUMN);
    }
}

enum Season02{
    //常量对象写在最前面 ,间隔 最后用;
    SPRING("春天","温暖"),
    AUTUMN ("秋天","凉爽"),
    SUMMER ("夏天","炎热"),
    WINTER ("冬天","寒冷");
    private String name;
    private String desc;

    private Season02(String name, String desc) {
        this.name = name;
        this.desc = desc;
        System.out.println("构造器初始化:name"+name+"desc :"+desc);
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

enum 注意事项

1.使用enum 会默认继承 Enum类
javap Season02.class 可以看到

javap Season02.class
Compiled from "enumtion02.java"
final class enumtion.Season02 extends java.lang.Enum<enumtion.Season02> {
  public static final enumtion.Season02 SPRING;
  public static final enumtion.Season02 AUTUMN;
  public static final enumtion.Season02 SUMMER;
  public static final enumtion.Season02 WINTER;
  public static enumtion.Season02[] values();
  public static enumtion.Season02 valueOf(java.lang.String);
  public java.lang.String getName();
  public java.lang.String getDesc();
  public java.lang.String toString();
  static {};

2.传统的

public final static Season SPRING = new Season("春天","温暖");

简化成

SPRING("春天","温暖"),

这里必须要知道他调用的那个构造器
3.如果使用无参构造器创建枚举对象,则实参数列表和小括号都可以省略(无参构造的直接写名字就行,这里枚举里面可以有多个构造器)
4…多个枚举对象,逗号间隔,最后一个用分号
5.枚举的对象放在最前面

例题分析

public class enumtion02 {
    public static void main(String[] args) {
        Gender gender1 =Gender.BOY;
        Gender gender2 = Gender.BOY;
        System.out.println(gender1);
        System.out.println(gender1 == gender2);
    }
}
enum Gender {
    BOY,
    GIRL;
    };

Enum 的 toString方法 return name;
输出:

BOY
true

Enum中的方法

//获取枚举对象名字
public final String name() {
        return name;
    }
//输出枚举对象的编号(从0开始)
 public final int ordinal() {
        return ordinal;
    }
//用字符串得到enum对象,名字一样的
 public static <T extends Enum<T>> T valueOf(Class<T> enumType,
                                                String name) {
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }
//比较两个枚举常量的 编号
public final int compareTo(E o) {
        Enum<?> other = (Enum<?>)o;
        Enum<E> self = this;
        if (self.getClass() != other.getClass() && // optimization
            self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

values方法

public class enumtion02 {
    public static void main(String[] args) {
        Gender gender1 =Gender.BOY;
        Gender[] gender2s =gender1.values();//IDEA .不出来Enum也没找到,反编译里面是有的,直接写能用,返回enum[]
        for (Gender gender2 : gender2s) {
            System.out.println(gender2.name());
        }
    }
}

enum Gender {
    BOY,
    GIRL;
    };
//输出 BOY GRIL

使用细节

使用enum 不能再继承任何类默认继承(Enum)
可以实现接口

枚举与switch
switch (枚举对象){
case:枚举成员
break;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值