/*
* enum类型不允许继承
* 除了这一点,我们基本上可以将enum看作一个常规的类
* 我们可以添加自己的方法与属性,我们也可以覆盖其中的方法。
* 不过一定要在enum实例序列的最后添加分号
*/
enum Hot{
LITTLE("litele hot"), MEDIEM("mediem hot"), HOT("very hot");
/*
* 添加自己的属性和方法
*/
private String des;
private Hot(String s) {
des = s;
}
public String getDes() {
return des;
}
//重新toString()
@Override
public String toString() {
return name() + " : " + name().toLowerCase();
} } public class Test{ public static void Select(Hot hot) {
switch(hot) {
case LITTLE: {
System.out.println(hot.toString());
break;
}
case MEDIEM: {
System.out.println(hot.toString());
break;
}
case HOT: {
System.out.println(hot.toString());
}
}
} public static void main(String[] args) { for (Hot hot : Hot.values()) {
System.out.println(hot + " : ordinal : " + hot.ordinal());
System.out.println(hot.compareTo(Hot.HOT));
System.out.println(hot.equals(Hot.HOT));
System.out.println((hot == Hot.HOT));
System.out.println(hot.getDeclaringClass());
System.out.println(hot.name());
System.out.println("description : " + hot.getDes());
System.out.println("--------------------------");
}
for (String s : "LITTLE MEDIEM HOT".split(" ")) {
Hot hot = Hot.valueOf(Hot.class, s);
System.out.println(hot.getDeclaringClass() + " : " + hot.toString());
}
System.out.println("----------------------------"); /*
* enum天生就是符合switch的
*/
Select(Hot.HOT); }
}
定义枚举的枚举:
import java.util.Random; /*
* 如何定义枚举的枚举,我们可以通过枚举的枚举,对类型进行分类
*/ /*
* 首先定义一个工具类来随机生成枚举的类型
*/
class EnumsUtils {
private static Random random = new Random(47);
//接收一个Enum类型的Class
public static <T extends Enum<T>> T random(Class<T> sc) {
return random(sc.getEnumConstants());
}
//接收Enum实例的数组
public static <T> T random(T[] values) {
return values[random.nextInt(values.length)];
}
} /*
* 定义枚举的枚举
*/
enum Meal{
APPETIZER(Food.Appetizer.class),
MAINCOURSE(Food.MainCourse.class); //注意分号 private Food[] values; //每一个Enum实例的所包含的Enum实例
private Meal(Class<? extends Food> kind) {
values = kind.getEnumConstants();
}
//非分类
public interface Food{
//开胃菜
enum Appetizer implements Food{
//莴苣,
SALAD, SOUP,SPRING_ROLLS
}
enum MainCourse implements Food{
LASAGNE, BURRITO,PAD_THAI
}
} public Food randomSelect() {
return EnumsUtils.random(values);
} }
public class Test{ public static void main(String[] args) {
for (int i = 0; i < 5; ++i) {
System.out.println("第" + (i + 1) + "套餐:" );
for (Meal meal : Meal.values()) {
Meal.Food food = meal.randomSelect();
System.out.println(food);
}
}
}
} 输出:
第1套餐:
SPRING_ROLLS
PAD_THAI
第2套餐:
SOUP
PAD_THAI
第3套餐:
SOUP
PAD_THAI
第4套餐:
SOUP
PAD_THAI
第5套餐:
SALAD
BURRITO
通过定义与常量有关的方法我们可以实现多态, 我们同时还可以在实例中覆盖方法:
import java.util.EnumSet;
/*
* 常量相关的方法,实现多态
* 覆盖常量相关的方法
* 中间我们还要用到EnumSet , 还有EnumMap , 他们查看API就可以了
*/
public class Test{ enum Hot{
//各自实现自己的description()
LITTLE {
@Override
void description() {
System.out.println("little hot ...");
}
},
MEDIM {
@Override
void description() {
System.out.println("Medim hot ...");
}
},
HOT {
@Override
void description() {
System.out.println("hot hot ....");
}
//可以覆盖自己的方法
public void show() {
System.out.println("very hot..");
}
};
//抽象方法, 实现多态
abstract void description();
public void show() {
System.out.println("hot ..hot ..");
}
}
EnumSet<Hot> hots = EnumSet.of(Hot.MEDIM, Hot.LITTLE);
public void add(Hot hot) {
hots.add(hot);
}
public void traverse() {
for (Hot e : hots) {
System.out.print("e.description() : "); e.description();
System.out.print("e.show() : "); e.show();
}
}
public static void main(String[] args) {
Test test = new Test();
test.traverse();
System.out.println("------------"); test.add(Hot.MEDIM); test.add(Hot.MEDIM);
test.add(Hot.HOT);
test.traverse(); }
} 输出:
e.description() : little hot ...
e.show() : hot ..hot ..
e.description() : Medim hot ...
e.show() : hot ..hot ..
------------
e.description() : little hot ...
e.show() : hot ..hot ..
e.description() : Medim hot ...
e.show() : hot ..hot ..
e.description() : hot hot ....
e.show() : very hot..