1.为什么枚举类中的构造函数自动默认为private,并且不能改变?枚举中的构造函数是怎么运行的?
public class RegExpTest { public static void main(String[] args) { Color c1=Color.BLUE; //要注意的是当创建了Color类对象的时候,这个枚举类中的所有实例都会调用构造函数,因此也就会有三个输出出现 // System.out.println(c1); // c1.colorInfo(); } } enum Color { RED, GREEN, BLUE; //它们本身就是枚举类Color的实例 // 构造函数 private Color() //之所以枚举类的构造函数是被private关键字修饰,是因为调用构造函数的对象是在Color之中,也就是RED, GREEN, BLUE { System.out.println("Constructor called for : " + this.toString()); } public void colorInfo() { System.out.println("Universal Color"); } }
运行结果是:
Constructor called for : RED Constructor called for : GREEN Constructor called for : BLUE
2.为什么枚举类型不能使用new来创建实例?
public enum Direction { FRONT, BEHIND, LEFT, RIGHT("红色"); } Direction d = Direction.FRONT;
不能使用new来创建枚举类的对象,因为枚举类中的实例就是类中的枚举项,所以在类外只能使用类名.枚举项。
3.枚举类在switch()中的用法:
在switch中,不能使用枚举类名称,例如:“case Direction.FRONT:”这是错误的,编译器会根据switch中d的类型来判定每个枚举类型,在case中必须直接给出与d相同类型的枚举选项,而不能再有类型。
Direction d = Direction.FRONT; switch(d) { case FRONT: System.out.println("前面");break; case BEHIND:System.out.println("后面");break; case LEFT: System.out.println("左面");break; case RIGHT: System.out.println("右面");break; default:System.out.println("错误的方向"); } Direction d1 = d; System.out.println(d1);