枚举
枚举是一种常量的集合。(枚举是一种特殊的类,里面只包含一组有限的特定的对象)
自定义实现枚举
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;
}