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;//枚举建议大写
}

测试结果

1486105-20190823225151978-1577192530.png

枚举中可以自定义方法,并且可以实现接口
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();
}

测试结果

1486105-20190823225242993-1734348048.png

枚举中可以实现抽象方法,使用内部类实现抽象方法
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();
}

测试结果

1486105-20190823225329474-1727296169.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值