/*
* 枚举:JDK1.5就引入
* 类似:列举,穷举,一一罗列
* Java枚举:把某个类型的对象,全部列出来
*
* 当什么情况下会用到枚举类型?
* 当某个类型的对象是固定的,有限的几个,那么就可以选择使用枚举。
* 在整个系统的运行期间,有且只有这几个对象。
*
* 例如:
* 性别 Gender,它的对象只有三个:男,女,妖
* 星期 Week,它的对象只有7个:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
* 季节 Season,它的对象只有4个:Spring,Summer,Fall,Winter
* OA系统,办公系统,员工的状态Status,有几种:忙Busy,闲Free,假Vocation,离职Left
* 支付系统,支付方式Payment,有几种:Alipay,Wechat,card, cash
* 。。。。。
*
* 讨论:JDK1.5之前,如果想要实现枚举的这种效果
* (1)构造器私有化:
* 目的:在这个类的外面,无法随意的创建对象
* (2)在这个类中,提前创建好几个对象,供别人使用
*
* JDK1.5之后,就优化了枚举的语法:
*
*/
public class TestEnum {
public static void main(String[] args) {
// Gender g1 = new Gender();
Gender nan1 = Gender.NAN;
Gender nan2 = Gender.NAN;
System.out.println(nan1 == nan2);//true
}
}
class Gender{
//public:使得外面可以直接访问
//static:使得可以使用“类名.”访问
//final:前调这个对象是不可变
public static final Gender NAN = new Gender("男");
public static final Gender NV = new Gender("女");
private String description;
private Gender(String description){
this.description = description;
}
}
/*
* 枚举是一种类,是一种特殊的类,特殊在它的对象是有限的几个常量对象。
*
* JDK1.5之后枚举的语法:
* 1、如何声明枚举类型?
* 【修饰符】 enum 枚举类型名{
* 常量对象列表
* }
*
* 【修饰符】 enum 枚举类型名{
* 常量对象列表;
* 其他的成员列表
* }
* 说明:如果常量对象列表后面还有其他的成员,那么需要在常量对象列表后面加;进行分割
*
* 2、枚举类型不能继承其他类型,因为枚举类型有一个隐含的父类
* java.lang.Enum
* 即Enum是所有 Java 语言枚举类型的公共基本类。
*
* (1)Enum类中有一个唯一的构造器
* protected Enum(String name, int ordinal)
* 这个构造器不是程序员手动调用的,是编译器自动调用,在所有枚举类型的构造器的首行,
* 帮我们自动调用,并且自动传入name和ordinal的值。
*
* name:就是常量对象名称
* ordinal:就是常量对象的序号,其中初始常量序数为零
*
* (2)String name()
* int ordinal()
* (3)String toString()
* 在Enum类中重写了Object类的toString方法,返回常量对象名
*
* 自定义的枚举类型,在eclipse工具类中,不能自动生成toString方法。手动重写。
* 因为eclipse认为,父类重写的toString方法的实现已经很完美了,就是返回常量对象名,已经能代表一切。
*
* 3、API中没有的方法,是编译器帮我们生成的方法
* (1)枚举类型[] values()
* (2)枚举类型 valueOf(String name)
*/
public class TestEnum2 {
public static void main(String[] args) {
Season s = Season.SPRING;
System.out.println(s);//自动调用toString
System.out.println(s.name());
System.out.println(s.ordinal());
System.out.println("-----------------");
Season[] all = Season.values();
for (int i = 0; i < all.length; i++) {
System.out.println(all[i]);
}
System.out.println("-----------------");
Season spring = Season.valueOf("SPRING");
System.out.println(spring);
}
}
enum Season{
//常量对象后面没有(值)就是调用无参构造
//常量对象后面有(值)就是调用有参构造
SPRING("春暖花开"),SUMMER,FALL,WINTER;
private String description;
private Season() {
}
private Season(String description) {
this.description = description;
}
public String toString(){
return name() + ":" + description;
}
}
/*
* 补充:枚举类型实现接口
*/
public class TestEnum3 {
public static void main(String[] args) {
MyEnum a = MyEnum.A;
a.test();
MyEnum b = MyEnum.B;
b.test();
}
}
interface MyInter{
void test();
}
enum MyEnum implements MyInter{
A{
@Override
public void test() {
System.out.println("aaa");
}
},B{
@Override
public void test() {
System.out.println("bbb");
}
}
}
/*enum MyEnum implements MyInter{
A,B;
@Override
public void test() {
System.out.println("test");
}
}*/