比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀
Posted Faith_xzc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀相关的知识,希望对你有一定的参考价值。
零基础学习之Java枚举类
概述
枚举类是Java类中一个特殊的类,它是用来专门解决某些类型的对象是有限的几个的场景。这样的场景在我们的生活中非常常见,比如:人的性别(男,女),一年的月份(1月…12月),一年的季节(春夏秋冬),一周内天的表示法(周一…周日),彩虹的颜色(红…紫)等等,所以枚举类在实际生活中尤其的有用。
专业点说就是:枚举类型本质上也是一种类,只不过是这个类的对象是固定的几个,而不能随意让用户创建。
Java枚举类是在JDK1.5新增的类。在JDK1.5之前,需要程序员自己通过特殊的方式来定义枚举类型。在JDK1.5之后,Java支持enum关键字来快速的定义枚举类型。
下面将以JDK1.5为界限对Java枚举类进行说明
JDK1.5之前
创建枚举类
在该阶段如果想要实现一个类对外提供固定个数得对象(枚举类)的功能,需要通过程序员自己的逻辑创建类,其创建要求如下:
- ①必须将构造器私有化
- ②需要设置若干个公有的静态常量(想要提供的对象)
- ③类中得对象,一定要设置为常量,不能被修改
- ④类中如果有属性,属性不能提供set方法(防止被修改)
代码示例
Person类
package com.atguigu.bean;
public class Person
private int id;
private String name;
private Gender gender; //对象关联
public Person()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public Gender getGender()
return gender;
public void setGender(Gender gender)
this.gender = gender;
实现枚举类的功能
package com.atguigu.bean;
public class Gender
//方法一:常用的
public static final Gender BOY = new Gender("男孩");
public static final Gender GIRL = new Gender("女孩");
private final String value;
private Gender(String value)
this.value=value;
public String getValue()
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;
*/
测试类
package com.atguigu.demo;
import com.atguigu.bean.Gender;
import com.atguigu.bean.Person;
public class Demo2
public static void main(String[] args)
Person person = new Person();
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后面可以写枚举常量名
代码示例
枚举类
package com.atguigu.bean;
public enum Gender2
// BOY,GIRL; 无参
BOY("男孩"), GIRL("女孩"); //必须在第一行
private String value;
Gender2(String value)
this.value =value ;
public String getValue()
return value;
@Override
public String toString()
return value;
测试类
package com.atguigu.demo;
import com.atguigu.bean.Gender2;
public class Demo3
public static void main(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(); //返回当前对象的位置(角标)
static values(); //返回该枚举类所有的常量对象
static valueOf(String name); //根据字符串的名称,返回常量对象
注:枚举类也不能被其他类继承
代码示例
测试类
package com.atguigu.demo;
import com.atguigu.bean.Gender2;
public class Demo3
public static void main(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 接口名
注意:
- 枚举类提供的对象个数是确定的,并且在类加载的时候对象已经产生了。所以,抽象方法的实现,可以将范围缩小到某个对象
常量对象 【(实参列表)】
对父级做扩展
- 当枚举类中所有的对象都单独对抽象方法做了实现,那么公有的实现就可以删除
代码示例
public enum Gender3 implements Eat
BOY("男孩")
@Override
public void eat()
System.out.println("男孩吃的多");
,
GIRL("女孩")
@Override
public void eat()
System.out.println("女孩吃的多");
;
interface Eat
void eat();
枚举类实现单例模式
基本介绍
如果枚举类的对象只有一个,那么可以作为单例模式的实现。这是因为单例模式约束一个类只能实例化一个对象。目前来说在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。
在 Java 中使用枚举作为单例有以下几个原因:
- 自由序列化。
- 保证一个实例(即使通过反射也不能实例化超过一个枚举。)
- 线程安全
代码示例
public class Singleton
public static void main(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();
enum Singleton
INSTANCE;
public void sayOK()
System.out.println("ok~");
以上是关于比起睡觉,我更喜欢刷巨详细的Java枚举类,这是来自猿人的自觉呀的主要内容,如果未能解决你的问题,请参考以下文章