星期六, 十一月 21, 2015 ?08:28:48
?
一、
1.作用
? ? ? ? 取代以往定义常量的方式,
? ? ? ? 程序在编译时检查的功能。
?
2.使用枚举类型设置常量
?
? ?2.1在接口中定义常量的常规方式
? ?
在以往设置常量时,通常将常量放置在接口中,这样程序中就可以直接使该常量用,并且该常量不可被修改,‘
因为在接口中定义该常量时,用static和final修饰符
?
public interface Constants{
public static final int C_A = 1;
public static final int C_B = 2;
}
?
? 2.2在JDK1.5版本新增枚举类型后就逐渐取代了以上定义常量的形式。
语法:
?
java.lang.Enum<E>
?
? ? ? public enum Constants {
C_A,
C_B,
C_C
}
当需要在程序中使用该常量时,可以使用Constants.C_A来表示。
?
?
? 2.2.2可以把相关的常量分组到一个枚举类型里
?
?
二、代码案例
?
1.代码案例:
?
? ? enum是jdk5引入的语法,定义一个enum类实际上也是定义一个class,只是通过enum定义这个特殊class的时候,编译器会帮你做些事情:
? ? ?所的枚举类会默认继承Enum类
? ? 所的枚举类是final的,不可扩展子类
? ? 所定义的枚举常量,会生成定义的枚举类中生成public static final常量
?
?
?
package day20;
?
public class EnumTest {
?
?
public enum Yuzhou {
NONAME,ONENAAME,TWONAME;
}
?
?
public static void main(String[] args) {
Yuzhou yy = Yuzhou.NONAME;
switch(yy) {
?
case NONAME:
System.out.println(".....NONAME");
break;
?
case ONENAAME:
System.out.println(".....ONENAME");
break;
?
case TWONAME:
System.out.println(".....TWONAME");
break;
?
default:
System.out.println("..............");
?
}
?
}
}
?
运行结果:
.....NONAME
?
?
问题:
? ? 1.Yuzhou yy = Yuzhou.NONAME,赋值枚举变量的时候,当然要带前缀了,因为这些枚举常量是指定枚举类中的常量,必须加上类限定前缀。
?
? 2.java的switch语法,是通过jvm的tableswitch和lookupswitch两个指令实现。
简单说一下实现原理:java编译器为switch语句编译成一个局部变量数组,每个case对应一个数组的索引,指令的执行是通过不同的数组索引找到不同的入口指令。所以原则上switch...case只能处理int型的变量。
?
? ? ?3.enum能用在switch语句中,也是一个语法,我们知道所有枚举类的父类Enum中有一个private final int ordinal;,java编译器检测到switch语句中变量是一个枚举类,则会利用之前枚举类的ordinal属性,编译一个局部变量数组,
? ??
? ? ?4.后续在进行case分支比较的时候,就是简单通过tableswitch或lookupswitch指令来进行跳转,
? ? ? ? ?需要注意的一点:这个局部变量数组的构建过程是在编译器在编译阶段完成的
?
1.2代码案例:
?
? ?向枚举中添加新方法
?
package day20;
?
public class EnumTest {
?
/*本例: ?向枚举中添加新方法
* 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。
* 而且 Java 要求必须先定义 enum 实例。*/
?
public enum Color{
RED(1,"红色"),GREEN(2,"绿色"),YELLOW(3,"黄色");
//定义私变量
private int inode;
private String value;
?
//定义构造方法,枚举类型只能为私
private Color(int _node,String _value) {
this.inode = _node;
this.value = _value;
}
?
//普通方法
public static String getValue(int _inode){
for(Color c : Color.values()) {
if(c.getInode() == _inode) {
return c.value;
}
}
return null;
}
?
?
//get set方法
public int getInode() {
return inode;
}
?
public void setInode(int inode) {
this.inode = inode;
}
?
?
public String getValue() {
return value;
}
?
public void setValue(String value) {
this.value = value;
}
?
?
?
}
?
public static void main(String[] args) {
System.out.print(Color.getValue(3));
}
}
?
1.3
?
案例3:
package day20;
?
public class EnumTest {
?
/*本例: ?向枚举中添加新方法
* 如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。
* 而且 Java 要求必须先定义 enum 实例。*/
?
?
?
public enum Yuzhou {
NONAME("waxun"),ONENAAME("yuzhou"),TWONAME("xiner");
String name;
private Yuzhou(String _name) {
this.name = _name;
}
?
public static String getValue(String _name){
for(Yuzhou y: Yuzhou.values()) {
if(y.getName() == _name) {
return y.name;
}
}
return null;
?
?
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
?
}
?
?
?
public static void main(String[] args) {
System.out.print(Yuzhou.getValue("waxun"));
}
}
运行结果:
waxun
?
星期六, 十一月 21, 2015 11:15:47
?
?
原文:http://yuzhouxiner.iteye.com/blog/2258247