Java枚举入门学习

接下来学习枚举的概念,以及基本使用。

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后定义枚举类型很方便,直接在里面写参数就可以,并且可以在里面添加属性、添加抽象方法,添加自定义方法,并且可以实现接口。

参考博客

(1)https://www.cnblogs.com/hyl8218/p/5088287.html 枚举

(2)https://www.cnblogs.com/ldl326308/p/9477923.html 枚举

原文地址:https://www.cnblogs.com/youngchaolin/p/11402813.html