Enum一般用来表示一组相同类型的常量。如性别、日期、月份、颜色等。对这些属性用常量的好处是显而易见的,不仅可以保证单例,且在比较的时候可以用”==”来替换equals。
JDK1.5之前没有Enum这个类型,那时候一般用接口常量来替代(C语言中的这种功能)。
public enum Color {
RED,BLUE,GREEN,WHITE,BLACK;//对象常量之间用逗号隔开,最后的分号可以省略
}
/*
* 三个知识点:
* 1.如果在对象常量后面要添加其它代码则必须以“;”号结束
* 2.如果我们没有给枚举类型写构造方法,那么Java会自动帮我们加一个(私有的)
* 3.枚举类中的构造方法只能是private的,即使我们不写,Java也会帮我们加private关键字
*/
public enum SexEnum {
MALE,FEMALE;
SexEnum(){
}
}
public enum Signal {
GREEN,YELLOW,RED
}
public enum Signal2 {
RED(1,"红色"),GREEN(2,"绿色"),YELLOW(3,"黄色");
private int no;
private String name;
//※从语法上讲,上面的属性不声明成final是可以,而且外部也可通过调用setter方法更改属性。
//※但是从实际项目的需求看,一般的属性都要声明成final,这样外部就无法通过setter方法更改信息了。
//如果上面的枚举常量对象是复杂类型(即用默认空参构造无法直接构造出来),
//那么我们就必须自己写能够构造这种类型对象的对应构造方法
private Signal2(int no,String name){
this.no=no;
this.name=name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
sexEnumDemo();
colorEnumDemo();
signalEnumDemo() ;
signalEnum2Demo();
}
public static void sexEnumDemo(){
//SexEnum a = new SexEnum();//枚举类型的对象是不能new---其实它的构造方法是private
SexEnum m = SexEnum.MALE;
SexEnum f = SexEnum.FEMALE;
SexEnum objs[] = SexEnum.values();
for(SexEnum obj:objs){
System.out.println(obj);
}
}
public static void colorEnumDemo(){
Color c1 = Color.BLUE; //c1的取值只能是 枚举Color中预先定义的其中一个
System.out.println(c1); //c1就是一个类对象,只是它的取值被限定了。该对象可以调用Object中的函数
Object obj = c1;//c1可以看成是Object的子类对象
}
public static void signalEnumDemo() {
Signal res = change(Signal.RED);
System.out.println(res);
}
public static Signal change(Signal c) {
switch (c) {
case RED:
return Signal.GREEN;
case YELLOW:
return Signal.RED;
case GREEN:
return Signal.YELLOW;
}
return null;
}
// //
public static void signalEnum2Demo() {
// Signal2 s1 = Signal2.GREEN;
Signal2 s1 = Signal2.RED;
// 显示给用户看时---用String型信息
String nm = s1.getName();
System.out.println("nm:" + nm);
// 给程序识别时---用int型信息
int n = s1.getNo();
System.out.println("n:" + n);
s1.setName("abc");
System.out.println("::::" + s1.getName());
}
}