• 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 枚举

  • 相关阅读:
    L1-046. 整除光棍
    L2-014. 列车调度
    L2-009. 抢红包
    L2-005. 集合相似度
    L2-021. 点赞狂魔
    L1-033. 出生年
    设计模式之生成器模式
    设计模式之抽象工厂模式
    设计模式之工厂方法模式
    设计模式之简单工厂模式
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11402813.html
Copyright © 2020-2023  润新知