枚举类型简介

/*最简单的枚举*/

1. public class TestEnum{  

2.     public enum ColorSelect{  

3.         red, green, yellow, blue;  

4.     }  

1. /* 枚举也可以象一般的类一样添做加方法和属性,你可以为它添加静态和非静态的属性或方法,这跟类的使用是一样的 */  

2.     public enum Season {  

3.         // 枚举列表必须写在最前面,否则编译出错  

4.         winter, spring, summer, fall;  

5.    

6.         private final static String location = "Phoenix";         

7.    

8.         public static Season getBest() {  

9.             if (location.equals("Phoenix"))  

10.                 return winter;  

11.             else  

12.                 return summer;  

13.         }  

14.     }  

15.     /*还可以有构造方法*/  

16.     public enum Temp {  

17.         /*通过括号赋值,而且必须有对应的带参构造器,否则编译出错 

18.          * 赋值必须是都赋值或都不赋值,不能一部分赋值一部分不赋值 

19.          * 如果不赋值则不能写构造器,赋值编译也出错*/  

20.         absoluteZero(-459), freezing(32),boiling(212), paperBurns(451);  

21.          

22.         private final int value;  

23.         public int getValue() {  

24.             return value;  

25.         }  

26.         //构造器默认也只能是private, 从而保证构造函数只能在内部使用  

27.         Temp(int value) {  

28.             this.value = value;  

29.         }  

30.     }  

31.    

32.     public static void main(String[] args) {  

33.         /* 

34.          * 枚举类型是一种类型,用于定义变量,以限制变量的赋值时通过"枚举名.值"来取得相关枚举中的值 

35.          */  

36.         ColorSelect m = ColorSelect.blue;  

37.         switch (m) {  

38.         /* 

39.          * 注意:枚举重写了toString(),所以枚举变量的值是不带前缀的 

40.          * 所以为blue而非ColorSelect.blue 

41.          */  

42.         case red:  

43.             System.out.println("color is red");  

44.             break;  

45.         case green:  

46.             System.out.println("color is green");  

47.             break;  

48.         case yellow:  

49.             System.out.println("color is yellow");  

50.             break;  

51.         case blue:  

52.             System.out.println("color is blue");  

53.             break;  

54.         }  

55.         System.out.println("遍历ColorSelect中的值");  

56.         /*通过values()获得枚举值的数组*/  

57.         for (ColorSelect c : ColorSelect.values()) {  

58.             System.out.println(c);  

59.             }  

60.         System.out.println("枚举ColorSelect中的值有:"+ColorSelect.values().length+"个");  

61.         /*ordinal()返回枚举值在枚举中的索引位置,从0开始*/  

62.         System.out.println(ColorSelect.red.ordinal());//0  

63.         System.out.println(ColorSelect.green.ordinal());//1  

64.         System.out.println(ColorSelect.yellow.ordinal());//2  

65.         System.out.println(ColorSelect.blue.ordinal());//3  

66.    

67.         /*枚举默认实现了java.lang.Comparable接口*/  

68.         System.out.println(ColorSelect.red.compareTo(ColorSelect.green));  

69.    

70.         System.out.println(Season.getBest());  

71.         for(Temp t:Temp.values()){  

72.             /*通过getValue()取得相关枚举的值*/  

73.             System.out.println(t+"的值是"+t.getValue());  

74.         }  

75.     }  

76. }  

1,枚举类型相当于特殊的类,经过编译之后同样产生一个class文件。枚举类型中可以定义方法(包括构造方法)、属性、静态的方法和属性、继承接口、重载覆盖等,类似于class。

2,枚举类型的定义:

Java代码  

1. public enum ColorSelect {  

2.         red, green, yellow, blue;  

3. }  

枚举类型使用enum来声明类型,枚举类型的每一个枚举值(枚举属性)都是枚举类型的实例,且都是public static final类型的实例。

3,枚举类型的继承:

(1),所有的枚举类型都隐含的继承自java.lang.Enum类,又因为Java是单继承的,所以一个枚举类型不能继承任何其他的类。

(2),枚举类型因为继承了java.lang.Enum类,又因为java.lang.Enum实现了java.lang.Comparable和java.io.Serializable接口,所以枚举类型也默认实现了这两个接口。

4,枚举类型的构造方法:

(1),必须是private访问权限,不能使public权限。这样就可以保证在枚举类型定义的外部无法使用new来创建枚举值。

(2),使用构造方法(当然是带参数的构造方法了!)赋值,则必须给所有的枚举值赋值;如果写了构造方法,却没有使用其用于赋值,则会报错。

5,继承自父类(java.lang.Enum)的方法:

(1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。

Java代码  

1. Color.RED.ordinal();  //返回结果:0  

2. Color.BLUE.ordinal();  //返回结果:1  

 

(2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(见示例)

Java代码  

1. Color.RED.compareTo(Color.BLUE);  //返回结果 -1  

 

(3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。

Java代码  

1. Color[] colors=Color.values();  

2. for(Color c:colors){  

3. System.out.print(c+",");  

4. }//返回结果:RED,BLUE,BLACK YELLOW,GREEN,  

 

4)  toString()方法: 返回枚举常量的名称。

Java代码  

1. Color c=Color.RED;  

2. System.out.println(c);//返回结果: RED  

 

(5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。

Java代码  

1. Color.valueOf("BLUE");   //返回结果: Color.BLUE  

 

(6)  equals()方法: 比较两个枚举类对象的引用。

6,枚举类型可以用于switch语句(见示例)。

7,枚举集合的使用:java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。

 

参考文章:

http://www.cnblogs.com/Fskjb/archive/2009/08/03/1537917.html

http://blog.csdn.net/sunxin1001/article/details/7532632

 

http://cardyn.iteye.com/blog/904534

Enum类的一些特点: 
1、Color枚举类就是class,而且是一个不可以被继承的final类。枚举值都是public static final的,也就是我们经常所定义的常量方式,因此枚举类中的枚举值最好全部大写。 
2、即然枚举类是class,当然在枚举类型中有构造器,方法和数据域。但是,枚举类的构造器有很大的不同:  
    (1) 构造器只是在构造枚举值的时候被调用。 
    (2) 构造器只能私有private,绝对不允许有public构造器。 
    (3) 枚举值必须要类的最前面。 
3、所有枚举类都继承了Enum的方法,具有这些方法。  
       (1)  ordinal()方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。 
                 Color.RED.ordinal();  //返回结果:0 
                 Color.BLUE.ordinal();  //返回结果:1 
       (2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺 序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码) 
                 Color.RED.compareTo(Color.BLUE);  //返回结果 -1 
       (3)  values()方法: 静态方法,返回一个包含全部枚举值的数组。 
                 Color[] colors=Color.values(); 
                 for(Color c:colors){ 
                        System.out.print(c+","); 
                 }//返回结果:RED,BLUE,BLACK YELLOW,GREEN, 

 (4)  toString()方法: 返回枚举常量的名称。 
                 Color c=Color.RED; 
                 System.out.println(c);//返回结果: RED 
       (5)  valueOf()方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。 
                 Color.valueOf("BLUE");   //返回结果: Color.BLUE 
       (6)  equals()方法: 比较两个枚举类对象的引用。 
4、枚举类可以在switch语句中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值