接下来学习枚举的概念,以及基本使用。
JDK1.5 特性-枚举
在开发中有一类数据集比较特殊,它们数值稳定并且元素个数有限,如一个星期的7天,一年的四个季节,一年的12个月等,这种有固定的内容的情况可以使用枚举,枚举的个数是固定的,不容许随意改动,它也是一个类,是JDK1.5引入的一个新的类型。
如下代码1和代码2是参考了博客的枚举简单使用,枚举中的值建议全部大写,语法格式如下:
enum 枚举名{
枚举值1,枚举值2,... 枚举值n;//结尾最好加上分号,如果只有一行可以不加
}
枚举简单使用
package com.boe.jdk;
/**
* 测试枚举定义和简单使用
* @author clyang
*
*/
public class TestEnum1 {
public static void main(String[] args) {
//枚举可以用在switch-case,switch中条件不仅仅可以是char,int,short等
Singal s=Singal.ONE;
int n=0;
System.out.println(n);
switch(s){
case ONE:
n=1;
break;
case TWO:
n=2;
break;
case THREE:
n=3;
break;
case FOUR:
n=4;
break;
}
//输出结果
System.out.println(n);
System.out.println(s.FOUR);//直接得到FOUR
}
}
//定义枚举
enum Singal{
ONE,TWO,THREE,FOUR;//枚举建议大写
}
测试结果
枚举中可以自定义方法,并且可以实现接口
package com.boe.jdk;
/**
* 向枚举中添加方法,并且实现接口
* @author clyang
*
*/
public class TestEnum2 {
public static void main(String[] args) {
Student s=Student.FOOTBALLPLAYER;
//枚举中自定义方法
System.out.println(s.getName());
System.out.println(s.getId());
System.out.println(Student.findIdByName("张三"));
System.out.println(Student.findNameById(2));
//枚举中接口方法
s.print();
}
}
//枚举中添加方法,根据学号找学生名字,根据学生名字找学号
enum Student implements Iprint{
//定义三个学生
Boss("张三",1),AUTHOR("李四",2),FOOTBALLPLAYER("王五",3);
private String name;
private int id;
//有参数构造方法
private Student(String name, int id) {
this.name = name;
this.id = id;
}
//根据名字寻找学号
public static int findIdByName(String name){
//values()方法得到所有的枚举元素
for(Student s:Student.values()){
if(s.getName()==name){
return s.getId();
}
}
return -1;//-1代表没找到
}
//根据学号寻找名字
public static String findNameById(int id){
//values()方法得到所有的枚举元素
for(Student s:Student.values()){
if(s.getId()==id){
return s.getName();
}
}
return "找不到";
}
//get set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//实现接口方法
@Override
public void print() {
System.out.println("enum还可以实现接口");
}
}
//定义接口
interface Iprint{
public abstract void print();
}
测试结果
枚举中可以实现抽象方法,使用内部类实现抽象方法
package com.boe.jdk;
public class TestEnumDemo1 {
public static void main(String[] args) {
//在JDK1.5之后,switch-case允许使用枚举,也可以使用字符串,但是使用枚举可以将错误在编译期体现出来
EnumSeason s=EnumSeason.SPRING;
switch(s){
case SPRING:
s.play();
break;
case SUMMER:
s.play();
break;
case AUTUMN:
s.play();
break;
case WINTER:
s.play();
break;
}
}
}
//JDK1.5后的枚举,建议大写
enum EnumSeason{
//枚举必须放在有效代码的第一行
//如果有抽象方法,内部类实现抽象方法
SPRING {
@Override
public void play() {
System.out.println("这是春天");
}
},SUMMER {
@Override
public void play() {
System.out.println("这是夏天");
}
},AUTUMN {
@Override
public void play() {
System.out.println("这是秋天");
}
},WINTER {
@Override
public void play() {
System.out.println("这是冬天");
}
};//默认底层还是按照JDK1.5之前的写法
//可以添加属性
private int month;
//如有后面添加有参构造方法,需添加默认构造方法
private EnumSeason(){
}
//添加一个有参构造方法测试
private EnumSeason(int month){
this.month=month;
}
//可以定义一个抽象方法
public abstract void play();
}
测试结果
JDK1.5之前的写法
package com.boe.jdk;
/**
* 测试枚举
* @author clyang
*
*/
public class TestEnumDemo {
Season s=Season.Spring;
}
//定义一个枚举类,代表四季
class Season{
//JDK1.5之前的写法
/**
* 需要明白public,final,static写的原因
* static:为了让外部类能直接调用
* final:为了不让外部可以修改
* public:为了公共都能访问
*/
//定义四季
public final static Season Spring=new Season();
public final static Season Summer=new Season();
public final static Season Autum=new Season();
public final static Season Winter=new Season();
}
总结
枚举是JDK1.5后引入的新特性,可以定义固定数量固定内容不能改动的量,JDK1.5后定义枚举类型很方便,直接在里面写参数就可以,并且可以在里面添加属性、添加抽象方法,添加自定义方法,并且可以实现接口。
参考博客