首页 > 编程语言 > 详细

day_20Java枚举

时间:2015-11-22 02:07:07      阅读:274      评论:0      收藏:0      [点我收藏+]

星期六, 十一月 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

?

?

day_20Java枚举

原文:http://yuzhouxiner.iteye.com/blog/2258247

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!