枚举的理解
1.为什么引入枚举
2.枚举的地位:枚举和类、接口有一样的地位---->他的外围声明方式和类、接口一样
举一个例子如下:
有一个Color.java的文件,如下:
public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN}/*外围定义:public enum Color{}..和类、接口声明方式是一样的 */3.与接口和类的区别及其本质:
Java 语言中的枚举(enum)只是编译现象而已,基本上完全在编译器中实现,
由编译器执行类型检查和类型推断,然后生成普通的class的字节码
将上述的Color的字节码文件Color.class反编译之后的源代码为:
public final class Color extends Enum{public static final Color RED;public static final Color BLUE;public static final Color BLACK;public static final Color YELLOW;public static final Color GREEN;private static final Color ENUM$VALUES[];private Color(String s, int i){super(s, i);}public static Color[] values(){Color acolor[];int i;Color acolor1[];System.arraycopy (acolor = ENUM$VALUES, 0, acolor1 = new Color[i = acolor.length], 0, i);return acolor1;}public static Color valueOf(String s){return (Color)Enum.valueOf(test/Color, s);}static {RED = new Color("RED", 0);BLUE = new Color("BLUE", 1);BLACK = new Color("BLACK", 2);YELLOW = new Color("YELLOW", 3);GREEN = new Color("GREEN", 4);ENUM$VALUES = (new Color[] {RED, BLUE, BLACK, YELLOW, GREEN});}}/*从这里我们可以得出以下的结论:(1)在未编译器之前(也就是在java文件中)enum不是一个类,所以他并不能new,所以在也不能调用其构造函数,其声明只能按枚举规定的语法来(2)而实际在jvm中enum声明定义的类型就是一个类(继承了java.lang.Enum).但其构造函数为私有..所以这个类在外部是不能生成对象..只能类内部生成,且其在内部构造的对象都是public static final类型的(3)从上面反编译的结果可以看出其中的枚举值本质是编译后的类的对象从(2)和(3)可以看出这个类在jvm中的对象个数是由其枚举值的个数来决定的.*/4.枚举的声明和使用
在声明时有四点和正常的类不一样
(1)按关键字使用enum声明枚举
(2)不能构造枚举对象.
(3)声明枚举值
(4)构造函数必须是私有的
(4)switch(表达式)
//表达式可以是一个"字符串",但编译成字节码后跟正常的类一样,只是把字符串变成了unicode编码
其他的可以和正常的类一样的使用和声明
例如可以为其声明变量函数,成员变量,
但再强调不允许调用其构造函数
以下是一个字符串类型的枚举声明示例
public enum Color {
RED("red"),BLUE("blue"),BLACK("black"),YELLOW("yellow"),GREEN("green");
//Color color = new Color("test", 10);
private Color(String color){
this.color = color;
}
private String color = null;
public int test = 0;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
//public static Color obj = new Color("red");
}
可以自己反编译看一下有什么不一样