详细阅读了相关java和c++有关枚举类的介绍。做一个总结 。
枚举类型使我们可以将一组常量组织在一起,和类一样,每个枚举类型定义了一种新的类型。java和c++不同之处在于:
c++的枚举类型只能是整形常量(int 、long、short)。
java的枚举类是一个继承于Enum(java.lang.Enum 是一个抽象类)的自定义类。所以我们可以使用Enum中的方法,也可以任意扩展枚举 类属性和方法。
从定义角度来看java的枚举类型灵活度更高。
C++中的枚举类型:
在c++11中枚举类型被分为限定作用域和不限定作用域。限定作用域的定义格式如下:
enum class (struct)[EnumeName] {<item1>, <item2>...<itemi>}[name];
非限定作用域的定义格式如下:
enum [EnumeName] {<item1>, <item2>...<itemi>}[name];
说明:
[]:表示可选,可以有,也可以缺省不写;
EnumeName:枚举的类型名;
name:枚举的对象名;
在限定作用域的枚举类型中,枚举成员遵循常规的作用域准则,并且在枚举类的作用域外是不可以访问的。而在不限定作用域的枚举类型中,枚举类型的作用域与枚举类型本身相同。
enum color {red, yellow, blue}; //不限定
enum class peper {red, yellow, blue}; //限定
color eyes = blue; //正确
peper p = blue; //错误
peper p = peper::blue; //正确
1,枚举成员默认从0开始,依次加1;
2,可以在定义枚举类型时给一个或几个成员指定值;
3,枚举成员是const的,初始化枚举成员时提供的初始化值必须是常量表达式;
4,枚举成员本身就是常量表达式,因此,可在任可需要用到常量值的地方使用枚举成员;
c++11中 我们可以通过在enmu的名字后加上冒号来 指定我们想要使用的类型(但只能指定整形类型)。指定类型后,一旦超出范围则会引发错误。默认情况下 限定作用域成员类型为int。不限作用域成员类型是潜在类型(就是说一定不会超出范围)如下:
enum intvalue : unsigned long{
a = 255, b = 666, c=1024
}
Java中的枚举类型:
Java 中的枚举类型采用关键字enum 来定义,是一个特殊的类,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型。Enum的定义如下:
public abstract class Enum<E extends Enum<E>>extends Object implements Comparable<E>, Serializable
【例1】枚举的简单使用
enum Move{left, right, up, down};
public static void main(String args[]) {
System.out.println(Move.left);
System.out.println(Move.right);
System.out.println(Move.up);
System.out.println(Move.down);
结果如下:
left
right
up
Down
上面这段代码中,Move其实是一个类,应该是一个Enum的子类。left, right, up, down是Enum的对象,应该是Move类中public static成员,Move中还有三个 static方法:
public static Move[] values();
public static Move Move.valueOf(String name);
public static T Move.valueOf(Class<T> enumType, String name);
java枚举类的switch用法:
enum Signal {
GREEN, YELLOW, RED
}
public class TrafficLight {
Signal color = Signal.RED;
public void change() {
switch (color) {
case RED:
color = Signal.GREEN;
break;
case YELLOW:
color = Signal.RED;
break;
case GREEN:
color = Signal.YELLOW;
break;
}
}
}
注意到 switch在使用枚举常量时候,不必在每个标签指明枚举名,可以由switch表达式值来确定.
因为java枚举类型是自定义类,所以其可以扩展各种属性和方法
public enum size
{
SMALL("S"),MEDIAN("M"),LARGE("L");
private String abbervation;
private Size(String abbervation){
this.abbervation = abbervation;
}
public String getAbbervation(){
return abbervation
}
参考文献: