一、枚举
1、概述
枚举:JDK1.5引入的,类似于穷举,一一罗列出来
Java 枚举:把某个类型的对象,全部列出来
2、应用
什么情况下会用到枚举类型?
当某个类型的对象是固定的,有限的几个,那么就可以选择使用枚举。
在整个系统的运行期间,有且只有这几个对象。
例如: 性别类:只有两个对象:男,女
季节类:有4个对象:春、夏、秋、冬
二、JDK1.5之前,实现枚举效果
1、需要把构造器私有化:
目的:在这个类的外面,无法随意的创建对象
2、在本类中,提前创建好对象,供别人使用
Demo:
1 public class TestEnum { 2 public static void main(String[] args) { 3 //Gender g1 = new Gender(); 构造器私有化,无法使用 4 5 Gender nan1 = Gender.NAN; 6 Gender nan2 = Gender.NAN; 7 System.out.println(nan1 == nan2);//true 8 } 9 } 10 class Gender{ 11 //public:使得外面可以直接访问 12 //static:使得可以使用“类名.”访问 13 //final:前调这个对象是不可变 14 public static final Gender NAN = new Gender("男"); 15 public static final Gender NV = new Gender("女"); 16 17 private String description; 18 19 private Gender(String description){ 20 this.description = description; 21 } 22 }
三、JDK1.5之后使用枚举
1、定义格式
(1)声明枚举类型
【修饰符】 enum 枚举类型名{ 常量对象列表 }
(2)声明枚举类型2
【修饰符】 enum 枚举类型名{ 常量对象列表; 其他的成员列表 }
说明:如果常量对象列表后面还有其他的成员,那么需要在常量对象列表后面加 ;进行分割。
2、枚举
(1)枚举是一种类,是一种特殊的类,特殊在它的对象是有限的几个常量对象。
(2)枚举类型不能继承其他类型,因为枚举类型有一个隐含的父类
java.lang.Enum 是所有 Java 语言枚举类型的公共基本类。
3、常用方法
(1)构造方法
Enum 类中有一个唯一的构造器
protected Enum(String name, int ordinal)
这个构造器不是程序员手动调用的,是编译器自动调用,在所有枚举类型的构造器的首行,并且自动传入 name 和 ordinal 的值。
name:表示常量对象名称
ordinal:表示常量对象的序号,其中初始常量序数为零
(2)name() 与 ordinal() 方法
String name():返回 常量对象名称 int ordinal():返回 常量对象序数
(3)toString() 方法
String toString():在Enum类中重写了Object类的toString方法,返回常量对象名
自定义的枚举类型,eclipse不能自动生成 toSring 方法,但是可以手动重写。因为IDE认为,父类的 toString方法已经很完美了。
(4)values() 与 valueof() 方法
枚举类型[] values():返回该枚举的所有枚举对象 枚举类型 valueOf(String name):根据name返回枚举对象
Demo:
1 public class TestEnum { 2 public static void main(String[] args) { 3 Season s = Season.SPRING; 4 System.out.println(s);//自动调用toString 5 6 System.out.println(s.name()); 7 System.out.println(s.ordinal()); 8 System.out.println("-----------------"); 9 10 Season[] all = Season.values(); //获取所有枚举对象 11 for (int i = 0; i < all.length; i++) { 12 System.out.println(all[i]); 13 } 14 15 System.out.println("-----------------"); 16 Season spring = Season.valueOf("SPRING"); 17 System.out.println(spring); 18 } 19 } 20 enum Season{ 21 //常量对象后面没有(值)就是调用无参构造 22 //常量对象后面有(值)就是调用有参构造 23 SPRING("春暖花开"),SUMMER,FALL,WINTER; 24 25 private String description; 26 27 private Season() { 28 29 } 30 31 private Season(String description) { 32 this.description = description; 33 } 34 // 手动重写 toString() 方法 35 public String toString(){ 36 return name() + ":" + description; 37 } 38 39 }
四、枚举类型实现接口
枚举实现接口要重写所有的抽象方法,所有对象可以都调用通用的重写方法,也可以调用各自重写的方法。
Demo:
1 public class TestEnum { 2 public static void main(String[] args) { 3 MyEnum a = MyEnum.A; 4 a.test(); 5 6 MyEnum b = MyEnum.B; 7 b.test(); 8 } 9 } 10 interface MyInter{ 11 void test(); 12 } 13 enum MyEnum implements MyInter{ 14 A{ 15 @Override 16 public void test() { 17 System.out.println("aaa"); 18 } 19 },B{ 20 @Override 21 public void test() { 22 System.out.println("bbb"); 23 } 24 } 25 } 26 enum MyEnum1 implements MyInter{ 27 A,B; 28 29 @Override 30 public void test() { 31 System.out.println("test"); 32 } 33 }