Java基础之枚举类–详解
文章目录
1.自定义枚举类
引入概念:
我们什么时候开始使用枚举类呢?
引入一个小案例:
我们生活中有春夏秋冬
那么这些属性都是固定的 这些名称都是不允许被修改的,那么我们可以自己定义一个类进行操作,这个类,
是不允许被外界访问,不允许被修改,是由我们自己创建的。
下面是代码演示
class Seasons{
private String name;
private String desc;
///这样一写的话 就可以使我们的这个数据变得不可以被外部修改了
private Seasons(String name, String desc) {
this.name = name;
this.desc = desc;
}
public static final Seasons spring=new Seasons("春天","温暖");//我们在内部去使用,不会被修改 优化一下可以加入final修饰符
//以此类推的书写下去 实现自定义枚举类的操作处理 枚举类型的名字使用大写 不要提供get/set方法 因为枚举对象通常只是可读的
//1.构造器私有化 2.本类内部创建一组对象 3.对外暴漏对象 4.可以提供get方法,但是不要提供set,就是为了我们的代码不被外界修改。
}
2.enum
这个其实就是帮助我们简化了的一个类,这个类是在我们自己写的自定义的基础进行了,优化,帮助我们用户更好的体验,只需要将,类名改为enum就行
代码演示
enum Seasons02{
SPRING("春天","温暖的"),//这句话等同于 public static final Seasons spring=new Seasons("春天","温暖");
WINTER("冬天","寒冷"),
private String name;
private String desc;
private Seasons02(String name,String desc){
this.name=name;
this.desc=desc;
}
3.枚举注意事项
1.我们要进行书写的时候,我们的声明必须放在最前面
2.最好采用大写,符合我们的规范。
3.隐藏了public static final关键字
4.默认继承Enum这个类,这个我们会在后面讲一下这个类的方法。
5.如果是无参,我们可以省去后面的括号,比如说SUMMER 我们直接书写就行。
我们使用javap采取反编译,可以查看我们的隐藏内容 大家可以可以清楚的看到我们是隐藏了public static final 我们这里采用反编译
按照正常的流程来说的话,我们是可以直接由源文件到字节码文件 现在我们使用了这个反编译的话,我们可以使得我们由class文件变为源文件,这样可以更加清楚的看到我们的细节。
4.Enum里面的一些方法
简单概述
简单概述一下这个是我们enum类继承的,可以相当于说是一个父类的存在形式,
我们可以直接使用里面的方法,下面给大家先看一下由哪些
1.name();
Seasons02 spring = Seasons02.SPRING;//这边就代表一个对象
System.out.println(spring.name());//这个就会打印枚举的名字出来
这个是会打印出我们当时定义枚举常量的名称 比如说我们现在就是SPRING
2.ordinal();
这个函数是帮助我们打印出我们当前这个枚举对象位于第几号,
我先给大家看一下我们的定义顺序
那么按照我们定义的顺序,我们的系统会从0开始给他们进行赋值
System.out.println(spring.ordinal());//输出的是该枚举对象的次序 是第几个的意思 其实就是编号的意思 我们的编号从0开始
3.values();
这个方法就比较的有意思,这个可以返回我们的全部枚举对象,
我们看一下这个函数的使用
Seasons02[] values = Seasons02.values();//也即是说这个方法会返回我们的value值 会帮助我们返回数值出来
我们会使用一个数组来接收他的返回值,他其实是返回这个类中所有进行定义过的数据出来
然后这个方法依次配合增强for循环来使用
增强for循环
我们先看一下这个写法
int[]arr={
1,2,3,4};
for(int i:arr){
//这个代码比较简洁 先说一下这个代码作用是把数组里面的每一个元素输出出来 第一个代表的意思是我们数组里面每一个元素都是int类型 我们给他们取名为i,这个i从arr里面取出来 依次去取直到没有
//输出
}
那么我们来看一下 这个for循环 就是遍历枚举类的 其实只是类型变一下,其他基本和整形数组无关。
Seasons02[] values = Seasons02.values();//也即是说这个方法会返回我们的value值 会帮助我们返回数值出来
for(Seasons02 seasons02:values){
//这个就是增强版for循环//这个会将一下
System.out.println(seasons02);//这里是默认调用我们的tostring方法(我们父类的tosting方法)
}
4.valueOf();
这个就是另一种创建
//valueOf: 将字符串转化为枚举对象,要求字符串必须为我们定义的才行
Seasons02 seasons02 = Seasons02.valueOf("SPRING");//这样直接创建一个对象,只要你的字符串是我们的枚举类就行
System.out.println(seasons02.name());
5.compareTo();
这个函数会配合我们之前说的ordinal();函数使用,这个就是一个做差的函数
我们先看一下这个如何操作
System.out.println(Seasons02.SPRING.compareTo(Seasons02.WINTER));//0-3=-3 这个就是我们的输出结果 -3
我们首先写出一个对象调用这个compareTo函数,然后里面的参数我们写上我们要比较的另一个对象。
结果是第一个减第二个
小小练习
描述:
/声明week枚举类,其中包含的是星期一至星期日的定义,Monday 。。。。。 //要求大家使用values返回所有的枚举数组,遍历
代码演示
大家可以看看会不会写 提示tosting父类的不好用就自己重写,到时候会调用自己重写的
public class EnumExerisice02 {
public static void main(String[] args) {
Week[] values = Week.values();
for(Week week:values){
System.out.println(week.toString());
}
}
}
enum Week{
MONDAY("星期一"),
TUESDAY("星期二"),
WEDNESDAY("星期三"),
THURSDAY("星期四"),
FRIDAY("星期五");
Week(String name) {
this.name = name;
}
private String name;
@Override
public String toString() {
//就是如果达不到预期的输出效果我们可以考虑一下重写的操作处理
return "Week{" +
"name='" + name + '\'' +
'}';
}
}
enum注意事项
就是这个类是默认继承Enum的所有,这个类是不能继承其他类了,大家注意一下,因为Java里面不允许多继承,但是还是可以依旧实现接口的,因为我们可以实现多个接口。
结语
今天枚举类的知识点比较少,但是还是比较基础,后续应该也是会使用到的,
我认为的枚举类是一个不允许被改变的 也即是为什么我们要是有public static final的操作
就是一种常量,大家可以这样认为,然后输出的时候大家可以重写tostring,因为name();这个打印的是你的那个自己写的名字,所以说我们还是要重写tostring。
我们大家一起加油!!!大家觉得不错可以点赞支持下。