如何理解java枚举,看例子

先来看一下不用枚举怎么表示常量:

//常量类
class Num {
    public static String ONE = "ONE";
    public static String TWO = "TWO";
    public static String THREE = "THREE";
    public static String FOUR = "FOUR";
    public static String FIVE = "FIVE";
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.THREE);
    }
}

 

再来看一下用了枚举怎么表示常量:

//常量类(枚举类)
enum Num {
    ONE,TWO,THREE,FOUR,FIVE
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.THREE);
    }
}

 

当然枚举还能用于 switch

//常量类(枚举类)
enum Num {
    ONE,TWO,THREE,FOUR,FIVE
}

//测试类
public class Test{
    public static void main(String[] args) {
        Num num = Num.THREE;  
        switch (num) {  
        case ONE:  
            System.out.println(Color.ONE);  
            break;  
        case TWO:  
            System.out.println(Color.TWO);  
            break;  
        case THREE:  
            System.out.println(Color.THREE);   
            break;  
        case FIVE:  
            System.out.println(Color.FIVE);  
            break;      
        }  
    }
}

 

 

那么问题来了!

枚举的成员是什么数据类型?  看下面的例子:

//常量类(枚举类)
enum Num {
    ONE(1),TWO(2),THREE(3),FOUR(4),FIVE(5);
    //构造方法(构造方法放在枚举成员的后面)
    Num (int data){}
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.FOUR); 
    }
}

通过上面的例子可以看出,枚举侧成员就是一个对象,成员对象的数据,与构造方法相关,每个成员对象的数据结构相同。

这里我们就可以理解Java枚举的一类相同的对象,这些对象内部的数据结构与枚举类的构造方法相关。

 

 

接下来进一步验证枚举成员的数据结构是不是与构造方法相关:

//常量类(枚举类)
enum Num {
    ONE(1, "one"),TWO(2, "two"),THREE(3, "three"),FOUR(4, "four"),FIVE(5, "five");
    //构造方法
    Num (int data,String str){}
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.FOUR); 
    }
}

通过上面的例子可以看出,枚举成员的数据结构只与构造方法相关。
那怎么取出枚举成员的数据呢?通过观察▲可以看出枚举类中还没有get和set方法。

 

//常量类(枚举类)
enum Num {
    ONE(1, "one"),TWO(2, "two"),THREE(3, "three"),FOUR(4, "four"),FIVE(5, "five");
    //构造方法
    Num (int data,String str){
        this.data=data;
        this.str=str;
    }
    
    //成员变量
    int data;
    String str;
    
    //get方法
    int getData(){
        return data;
    }
    String getStr(){
        return str;
    }
    
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.FOUR.getData()); 
        System.out.println(Num.FOUR.getStr()); 
    }
}

通过通过添加枚举类的成员变量和get方法之后成功获取了,成员的数据。

这时再来回看java枚举类,就能发现Java枚举类和普通的类没什么不同,只是枚举成员就像数组对象一样存放,枚举成员的数据结构与构造方法相关。

 

 

添加set方法之后就能修改它的值了:

//常量类(枚举类)
enum Num {
    ONE(1, "one"),TWO(2, "two"),THREE(3, "three"),FOUR(4, "four"),FIVE(5, "five");
    //构造方法
    Num (int data,String str){
        this.data=data;
        this.str=str;
    }
    
    //成员变量
    int data;
    String str;
    
    //get方法
    int getData(){
        return data;
    }
    String getStr(){
        return str;
    }
    //set方法
    void setData(int data){
        this.data = data;
    }
    void setStr(String str){
        this.str = str;
    }
    
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.FOUR.getStr()); 
        Num.FOUR.setStr("四"); 
        System.out.println(Num.FOUR.getStr()); 
    }
}

 

 

枚举侧常规用法:

//常量类(枚举类)
enum Num {
    ONE(1, "小米"),TWO(2, "华为"),THREE(3, "苹果"),FOUR(4, "菠萝"),FIVE(5, "坦克");
    //构造方法
    Num (int index,String name){
        this.index = index;
        this.name = name;
    }
    
    //成员变量
    int index;
    String name;
    
    //get方法
    int getIndex(){
        return index;
    }
    String getName(){
        return name;
    }
    //set方法
    void setIndex(int index){
        this.index = index;
    }
    void setName(String name){
        this.name = name;
    }
    
    //根据index获取 name
    static String getNameByIndex(int idx){
       for (Num n : Num.values()) {  
            if (n.getIndex() == idx) {  
                return n.name;  
            }  
        }  
        return "没有找到";  
    }
    
}

//测试类
public class Test{
    public static void main(String[] args) {
        System.out.println(Num.getNameByIndex(3)); 
    }
}

 

posted @ 2020-12-02 21:29  一文搞懂  阅读(286)  评论(0编辑  收藏  举报