零基础学习之Java枚举类
概述
枚举类是Java类中一个特殊的类,它是用来专门解决某些类型的对象是有限的几个的场景。这样的场景在我们的生活中非常常见,比如:人的性别(男,女),一年的月份(1月…12月),一年的季节(春夏秋冬),一周内天的表示法(周一…周日),彩虹的颜色(红…紫)等等,所以枚举类在实际生活中尤其的有用。
专业点说就是:枚举类型本质上也是一种类,只不过是这个类的对象是固定的几个,而不能随意让用户创建。
Java枚举类是在JDK1.5新增的类。在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型。在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型。
下面将以JDK1.5为界限对Java枚举类进行说明
JDK1.5之前
创建枚举类
在该阶段如果想要实现一个类对外提供固定个数得对象(枚举类)的功能,需要通过程序员自己的逻辑创建类,其创建要求如下:
- ①必须将构造器私有化
- ②需要设置若干个公有的静态常量(想要提供的对象)
- ③类中得对象,一定要设置为常量,不能被修改
- ④类中如果有属性,属性不能提供set方法(防止被修改)
代码示例
Person类
packagecom.atguigu.bean;publicclassPerson{privateint id;privateString name;privateGender gender;//对象关联publicPerson(){}publicintgetId(){return id;}publicvoidsetId(int id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicGendergetGender(){return gender;}publicvoidsetGender(Gender gender){this.gender = gender;}}
实现枚举类的功能
packagecom.atguigu.bean;publicclassGender{//方法一:常用的publicstaticfinalGender BOY =newGender("男孩");publicstaticfinalGender GIRL =newGender("女孩");privatefinalString value;privateGender(String value){this.value=value;}publicStringgetValue(){return value;}/*
方法二
public static final Gender BOY;
public static final Gender GIRL;
static {
BOY = new Gender();
GIRL = new Gender();
}
public Gender() {
}*//*
方法三
public static final Gender BOY =new Gender();
public static final Gender GIRL =new Gender();
public Gender() {
}
public static Gender getBOY() {
return BOY;
}
public static Gender getGIRL() {
return GIRL;
}*/}
测试类
packagecom.atguigu.demo;importcom.atguigu.bean.Gender;importcom.atguigu.bean.Person;publicclassDemo2{publicstaticvoidmain(String[] args){Person person =newPerson();
person.setId(10);
person.setName("张三");
person.setGender(Gender.BOY);System.out.println(person.getName()+"的性别是:"+person.getGender().getValue());}}
JDK1.5之后
创建枚举类
在JDK.5之后,Java提供了enum关键字来快速的定义枚举类型,这样枚举类实现起来就非常方便了。其实现语法如下:
【修饰符】 enum 枚举类名{
常量对象列表
}
【修饰符】 enum 枚举类名{
常量对象列表;
其他成员列表;}
虽然方便实现了,但是该方法实现枚举类也有很多需要注意的点:
- ①枚举类的构造器默认是私有的,并且必须是私有的
- ② 直接写对象名即可(对象与对象之间采用逗号隔开,最后使用分号)
- ③ 默认是采用无参构造器(后期可以设置)
- ④ 对象默认就是共有的静态的常量
- ⑤ 对象列表必须在类的首行
- ⑥ 如果显示的创建了有参的构造器,没有无参构造器对象的创建就需要使用有参构造器 ,每个对象后面加小括号
- ⑦ JDK1.5之后switch,提供支持枚举类型,case后面可以写枚举常量名
代码示例
枚举类
packagecom.atguigu.bean;publicenumGender2{// BOY,GIRL; 无参BOY("男孩"),GIRL("女孩");//必须在第一行privateString value;Gender2(String value){this.value =value ;}publicStringgetValue(){return value;}@OverridepublicStringtoString(){return value;}}
测试类
packagecom.atguigu.demo;importcom.atguigu.bean.Gender2;publicclassDemo3{publicstaticvoidmain(String[] args){Gender2 gender2 =Gender2.BOY;//通过类名可以调用说明是静态的,跨包是共有的// Gender2.BOY = Gender2.Girl; 不可以更改说明是常量System.out.println(gender2.getValue());//返回该枚举类所有的常量对象,(后面会说到这个方法)Gender2[] gender21 =Gender2.values();for(int i =0; i < gender21.length; i++){switch(values[i]){case BOY:System.out.println(values[i]+":男孩");break;case GIRL:System.out.println(values[i]+":女孩");break;}}}
枚举类继承父类
基本介绍
枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类。继承了Enum类的枚举类默认有以下几种方法:
name();//获取对象的名称toString();//返回也是对象的名称,自定义的枚举类可以再次重写ordinal();//返回当前对象的位置(角标)staticvalues();//返回该枚举类所有的常量对象staticvalueOf(String name);//根据字符串的名称,返回常量对象
注:枚举类也不能被其他类继承
代码示例
测试类
packagecom.atguigu.demo;importcom.atguigu.bean.Gender2;publicclassDemo3{publicstaticvoidmain(String[] args){Gender2 gender2 =Gender2.BOY;//获取对象的名称System.out.println(gender2.name());//返回也是对象的名称,自定义的枚举类可以再次重写System.out.println(gender2.toString());//返回当前对象的位置(角标)System.out.println(gender2.ordinal());//返回该枚举类所有的常量对象Gender2[] gender21 =Gender2.values();for(int i =0; i < gender21.length; i++){System.out.println(gender21[i]);}//根据字符串的名称,返回常量对象String str ="BOY";Gender2 gender22 =Gender2.valueOf(str);System.out.println(gender22);}}
枚举类实现接口
基本介绍
枚举类虽然不能继承其他的类,但是枚举类也是类,可以实现接口,可以同时实现多个接口。可以统一实现,也可以用匿名内部类的形式,单独给某个常量对象实现抽象方法。
修饰符 类名 implements 接口名{}
注意:
- 枚举类提供的对象个数是确定的,并且在类加载的时候对象已经产生了。所以,抽象方法的实现,可以将范围缩小到某个对象
常量对象 【(实参列表)】{
对父级做扩展
}
- 当枚举类中所有的对象都单独对抽象方法做了实现,那么公有的实现就可以删除
代码示例
publicenumGender3implementsEat{BOY("男孩"){@Overridepublicvoideat(){System.out.println("男孩吃的多");}},GIRL("女孩"){@Overridepublicvoideat(){System.out.println("女孩吃的多");}};}interfaceEat{voideat();}
枚举类实现单例模式
基本介绍
如果枚举类的对象只有一个,那么可以作为单例模式的实现。这是因为单例模式约束一个类只能实例化一个对象。目前来说在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。
在 Java 中使用枚举作为单例有以下几个原因:
- 自由序列化。
- 保证一个实例(即使通过反射也不能实例化超过一个枚举。)
- 线程安全
代码示例
publicclassSingleton{publicstaticvoidmain(String[] args){Singleton singleton1 =Singleton.INSTANCE;Singleton singleton2 =Singleton.INSTANCE;System.out.println(singleton1 == singleton2 );System.out.println("singleton1 ,hashCode= "+ singleton1.hashCode());System.out.println("singleton2 ,hashCode = "+ singleton2.hashCode());
singleton1.sayOK();}}enumSingleton{
INSTANCE;publicvoidsayOK(){System.out.println("ok~");}}
版权归原作者 Faith_xzc 所有, 如有侵权,请联系我们删除。