您的位置:首页 > 编程语言 > Java开发

I学霸官方免费教程二十五:Java基础教程之枚举 enum

2015-08-11 19:01 471 查看

枚举

枚举简单的说就是将需要的常量值一个一个的列举出来,并封装成一个整体。

语法格式:[public] enum 枚举名{ //值列表 }

声明格式:枚举名 变量名;

赋值格式:变量名 = 枚举名.值

其中的列举的每个值要符合标识符命名规则,不可随意编写

实例:
package enumdemo.simple;
/**
* 创建枚举类型的Week 注意:这里创建的是枚举,即数据类型是enum,而不是类
* @author 学霸联盟 - 赵灿
*/
public enum Week {
// 列举出周的值,中间用英文格式的逗号隔开
// 枚举中没有类型之分,直接列举需要的值即可
星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日
}

package _enum.simple;
/**
* 测试枚举的使用
* @author 学霸联盟 - 赵灿
*/
public class Test {
public static void main(String[] args) {
// 在switch中的应用;这样week代表的就是星期三
Week week = Week.星期三;
// 这里传入了枚举类型的变量week
switch (week) {
// 这里的case值直接使用枚举中存在的值,不能使用其他值
case 星期一:
System.out.println("周一");
break;
case 星期二:
System.out.println("周二");
break;
case 星期三:
System.out.println("周三");
break;
case 星期四:
System.out.println("周四");
break;
case 星期五:
System.out.println("周五");
break;
case 星期六:
System.out.println("周六");
break;
case 星期日:
System.out.println("周日");
break;
}
}
}
输出结果:
周三


以下内容初学者可选读

public  enum  Week{
//这些值会被转换成Week类型的属性(变量)名
星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日
}
//下面代码是枚举Week转换成类以后的代码
//枚举中列举的每个值都要符合标识符命名规则;这是因为枚举属于引用类型,在底层处理时,枚举Week会被转换成
public  final  class  Week  extends java.lang.Enum<Week>{
public  static  final  Week  星期一;
public  static  final  Week  星期二;
public  static  final  Week  星期三;
public  static  final  Week  星期四;
public  static  final  Week  星期五;
public  static  final  Week  星期六;
public  static  final  Week  星期日;
public  static  final  Week[]  $VALUES;
static{
星期一 = new  Week();
星期二 = new  Week();
星期三 = new  Week();
星期四 = new  Week();
星期五 = new  Week();
星期六 = new  Week();
星期七 = new  Week();
$VALUES = {星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期七}
}
public  static  Week[]  values(){
return  (Week[])($VALUES. clone());
}
public static Week valueOf(String  name){
return  (Week)(super. valueOf(Week.class, name));
}
}


可以看到转换后的Week类中,所有成员都是静态的,所以提现出来的是值类型的特性

注意:虽然枚举在底层会被转换成类;但在使用时,不需要使用new去创建对象。需要传递时也都是值传递的特性

另外,枚举中可以有属性和方法,包括构造方法;

例1:
public  enum  Week{
//MON会被转换成一个Week类型的属性,在创建Week对象是调用Week的无参构造
MON( )
}

public  enum  Week{
//由于声明了带一个String类型参数的构造方法,所以此处这样写时也要带参数
//注意:属性、方法、构造方法的声明都必须放在枚举值之后
MON("星期一")

//在枚举Week中声明一个带参数的构造方法
//注意:枚举中声明构造方法只能使用private修饰或者不写,不能使用public和protected
private  Week(String  value){
//枚举中也可以使用this关键字
this.value = value;
}
//属性和方法可以使用所有的访问修饰符修饰
private  String  value;
//声明一个获取value的方法
public  String  getValue(){
//没有局部变量和属性value冲突,关键字this可以省略
return  value;
}
}

public  class  Test{
public static void main(String[] args) {
//输出MON的值
System.out.println(Week.MON.getValue());
}
}
输出结果:星期一


例2:
/**
* 枚举Week
* @author 学霸联盟 - 赵灿
*/
enum Week {
/*
* 枚举值
* 因为该枚举中声明了带一个int类型参数的构造方法
* 所以枚举值后需要加小括号()中带一个int类型的值
* 这个值会传递给构造方法中的形参value
*/
MON(1), TUE(2), WED(3), THU(4), FRI(5),
//SAT(6){}这样写作用类似匿名内部类
SAT(6) {
// 重写getValue方法
@Override
public int getValue() {
return 60;
}
},
SUN(7) {
@Override
public int getValue() {
return 70;
}
};

// 枚举的属性
private int value;
// 该枚举的构造方法
Week(int value) {
this.value = value;
}
// 该枚举的普通方法
public int getValue() {
return value;
}
}
/**
* EnumTest类:用于测试枚举的使用
* @author 学霸联盟 - 赵灿
*/
public class EnumTest {
public static void main(String[] args) {
System.out.println("EnumTest.FRI 的 value = " + Week.FRI.getValue());
System.out.println("EnumTest.SAT 的 value = " + Week.SAT.getValue());
}
}
运行结果:
EnumTest.FRI 的 value = 5
EnumTest.SAT 的 value = 60


版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: