本文共 2081 字,大约阅读时间需要 6 分钟。
一、枚举的用途
枚举是Java中一种特殊的类,因而也叫枚举类。一般用来表示一类事物的多个状态/形态等,比如季节之于春夏秋冬,性别之于男女,等等。
二、枚举的简单例子
1、定义枚举类:
2、使用枚举类:
输出:
三、对二中例子的深入剖析
1、对Sex.java进行反汇编:javap Sex.class
注:javap,jdk自带的反汇编器(对class文件进行反汇编)
从反汇编的结果进行分析,可以得出如下结论:
a、用enum标志的枚举类默认继承了java.lang.Enum。
b、枚举类是一个final class,因此不能被其他类继承(枚举类是太监?)
c、中的Male和Female是Sex类的两个实例:
d、values()方法返回一个Sex数组
e、valueOf()方法以字符串作参数,返回一个Sex对象
2、对values()方法进行分析
输出:
总结:根据书写顺序把枚举常量序列变成一个枚举数组
注意:enum声明的类默认继承了Enum类,Enum类中没有values()这个方法。那么values()方法从哪来的呢?编译器添加的。
3、valueOf()方法:
输出:
输出:
总结:若存在和参数字符串同名的枚举常量,则返回这个枚举常量;否则报错。
4、编译器让每个枚举类都隐式继承了Enum,Enum的主要内容如下:
这里对name()和ordinal()这两个方法进行讲解:
1)name():返回枚举常量的名字(字符串)
输出:
2)ordinal():返回枚举常量的位序(即书写顺序,从0开始)
输出:
四、枚举的更多例子
1、Color枚举类:
public enum Color { /** * 下面定义了3个枚举常量 * 以Red(10,"红色")为例,它相当于public static final Color Red=new Color(10,"红色"); */ Red(10,"红色"),Green(20,"绿色"),Yellow(30,"黄色"); //下面自定义了两个属性,0到多个属性皆可 //一般来讲,枚举类的getter有意义,setter无意义 private int val; private String msg; //注:枚举类构造方法的默认访问修饰符是private,也只能是private,而不能是其他 Color(int val,String msg){ this.val=val; this.msg=msg; } public int getVal() { return val; } public void setVal(int val) { this.val = val; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}
2、测试:
public class Test { public static void main(String[] args) { //1、测试name()方法和ordinal()方法 System.out.println("1:"+Color.Red.name()+","+Color.Red.ordinal()); //2、测试values()方法 //println(c)相当于println(c.toString()),println(c.toString())又相当于c.name() for(Color c:Color.values())System.out.println("2:"+c); //3、测试valueOf()方法 Color c=Color.valueOf("Red"); System.out.println("3:"+c); //4、测试自定义的val和msg Color c2=Color.Green; System.out.println("4:"+c2.getVal()+","+c2.getMsg()); //5、测试setter(没意义)和getter //注意:枚举类都是单例的 Color.Red.setMsg("很红很红的那种"); System.out.println("5:"+Color.Red.getMsg()); }}
输出:
1:Red,0
2:Red 2:Green 2:Yellow 3:Red 4:20,绿色 5:很红很红的那种
转载地址:https://liuxingchang.blog.csdn.net/article/details/116494214 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!