枚举类——指向自己的数据结构
public enum Weekday { SUN,MON,TUS,WED,THU,FRI,SAT }
编译一下它,再反编译一下看看它到底是什么样子的:
如果写成代码就是:
小白惊奇的发现,枚举类内部有多个不同的这个枚举类的实例,这些不同的实例仅名称不同,而内部结构都一样。
在这个类的内部还有这个类的实例,那么,内部实例的结构岂不是和这个类相同,内部实例的内部还将有内部实例,以此类推无穷无尽。
public class Main { public static void main(String[] args) { for (Weekday day : Weekday.values()) { System.out.println(day.name()); } Weekday fri = Weekday.FRI.FRI.FRI.FRI; Weekday fri1 = Weekday.FRI; Weekday fri2 = Weekday.FRI.FRI; Weekday fri3 = Weekday.FRI.FRI.FRI; // enum -> String: System.out.println("FRI.name() = " + Weekday.FRI.name()); // 定义时的序号: System.out.println("FRI.ordinal() = " + fri.ordinal()); // String -> enum: System.out.println(Weekday.valueOf("FRI").name()); System.out.println(Weekday.valueOf("FRI")==Weekday.FRI); System.out.println(fri==Weekday.FRI); System.out.println(fri==fri1); System.out.println(fri==fri2); System.out.println(fri==fri3); // 不存在的name: //Weekday.valueOf("ABC"); } }
结果:
SUN
MON
TUE
WED
THU
FRI
SAT
FRI.name() = FRI
FRI.ordinal() = 5
FRI
true
true
true
true
true
瞬时想起无限循环递归,会耗尽内存。这样用就没事么?
原来,类的内部实例都是static静态类型的实例,静态实例有个特性就是不管创建多少实例,实际上都只有一个实例。
恍然大悟,原来类内部的实例指向自己,所以才可以这样调用。