1.什么是枚举用enum修饰是一种特殊的类,但枚举是类,使用枚举可以很方便的定义常量
枚举的概念:枚举类是一种特殊形式的Java类,枚举类的对象个数是有限且明确的
为什么需要枚举:
因为一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值
自定义枚举类
package cn.tedu.exec;
/*
JDK1.8之前 枚举类定义和使用
*/
//自定义枚举
class Season {
/*
1.枚举类中声明的每一个枚举值代表枚举类的一个实例对象
2.与Java中的普通类一样在声明枚举类时也可以声明属性方法和构造函数
3.但是枚举类的构造函数必须为私有的
4.枚举都必须要大写
*/
//1.私有化常量类型
private final String SEASON_NAME;
private final String SEASON_DEAE;
//2.私有化形参构造器
private Season(String SEASON_NAME, String SEASON_DEAE) {
this.SEASON_NAME = SEASON_NAME;
this.SEASON_DEAE = SEASON_DEAE;
}
//3.公共静态常量创建对象
public static final Season SPRING=new Season("春天","春暖花开");
public static final Season SUMMER=new Season("夏天","夏日炎炎");
public static final Season AUTUMM=new Season("秋天","秋高气爽");
public static final Season WINTER=new Season("冬天天","寒风凛凛");
//4.提供get方法
public String getSEASON_NAME() {
return SEASON_NAME;
}
public String getSEASON_DEAE() {
return SEASON_DEAE;
}
//5.重写toString方法
@Override
public String toString() {
return "Season{" +
"SEASON_NAME='" + SEASON_NAME + '\'' +
", SEASON_DEAE='" + SEASON_DEAE + '\'' +
'}';
}
}
class SeasonTest {
public static void main(String[] args) {
//1.打印通过类名调用对象获取get方法
System.out.println(Season.SPRING.getSEASON_NAME());
System.out.println(Season.SUMMER.getSEASON_NAME());
//2.使用类名调用对象获取toString
System.out.println(Season.AUTUMM);
}
}
使用枚举enum实现枚举类
package cn.tedu.exec;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.w3c.dom.ls.LSOutput;
/*
JDK1.8之后使用定义枚举和使用
*/
//使用enum关键字定义枚举类
enum Food{
/*
1.public static final可以省略不写
2.枚举对象不能像自定义枚举类对象时new
3.枚举名1(值1,值2),枚举名2(值1,值2),枚举名3(值1,值2);
4.不需要生成toString,因为使用enum关键字定义的枚举类继承了java.lang.Enum
5.在Enum中重写了继承自Object的toString()直接打印的就是枚举名
*/
//1.通过枚举名传形参
HAMBURG("汉堡","又大又扁"),
BEEF("牛肉","肉质柔软"),
MUTTON("羊肉 ","烹调的香味");
//2.私有化常量类型
private final String FOOD_NAME;
private final String FOOD_DESE;
//3.提供枚举形参构造器
Food(String FOOD_NAME, String FOOD_DESE) {
this.FOOD_NAME = FOOD_NAME;
this.FOOD_DESE = FOOD_DESE;
}
//4.提供get方法
public String getFOOD_NAME() {
return FOOD_NAME;
}
public String getFOOD_DESE() {
return FOOD_DESE;
}
}
/*
食物测试类
*/
class TestFood{
public static void main(String[] args) {
//1.通过枚举类调用枚举名获取类型名
System.out.println(Food.HAMBURG.getFOOD_NAME());
System.out.println(Food.BEEF.getFOOD_NAME());
System.out.println(Food.MUTTON.getFOOD_NAME());
//2.通过枚举类调用枚举名获取类型描述
System.out.println(Food.HAMBURG.getFOOD_DESE());
System.out.println(Food.BEEF.getFOOD_DESE());
System.out.println(Food.MUTTON.getFOOD_DESE());
}
}
总结新的知识点:
枚举的作用分为
1.限定用户输入的值,保证安全,有效性2.快速找到所需要的值
枚举的本质:整型的字面值,效率高 3.枚举类型更规范,在函数形参定义为枚举类型的时候,
4.只接受枚举类型的常量,比起普通的更安全,5.枚举类型成员默认被public static final修饰
使用枚举类的好处
1.提高代码的维护性,确保变量合法 2.提高代码可读性 3.提高代码键入
枚举类的底层实现
枚举类在后台实现时,实际上是转化为一个继承了java.lang.Enum类的实体类,
原先的枚举类型变成对应的实体类型,
并且会生成一个新的构造函数,若原来有构造函数,
则在此基础上添加两个参数,生成新的构造函数
枚举类是线程安全的 为什么是线程安全的
1.我们定义的一个枚举,在第一次被真正用到的时候,
会被虚拟机加载并初始化,而这个初始化过程是线程安全的。而我们知道,解决单例的并发问题,
主要解决的就是初始化过程中的线程安全问题 2.由于枚举的以上特性,枚举实现的单例是天生线程安全的
枚举类的特点:
1.所有的枚举类都是Enum的子类 2.我们可以通过枚举类名 枚举项名称 去访问指定的枚举项
3.每个枚举类项其实就是该枚举的一个对象 4.枚举也是一个类,也可以去定义一个成员变量
5.枚举类的第一行上必须是枚举项 最后一个枚举项后的分后是可以省略的 但是如果枚举类有其他的东西
这个分号就不能省略 建议不要省略
6.枚举类可以有构造器和构造函数 但必须是private的 它默认的也是private的 枚举项的用法比较特殊
枚举("");
7.枚举类也可以有抽象方法 但是枚举项必须重写该方法
版权声明:本文为m0_64792413原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。