1. 程式人生 > >JAVA程式設計基礎——列舉

JAVA程式設計基礎——列舉

一、列舉型別

(一)列舉型別是類的一種特殊形式,用於宣告一組命名的常量。

enum Student{//列舉名
    ZHANGSAN,//列舉體
    LISI,
    WANGWU;
}

(二)宣告列舉就是定義一種特殊形式的類,但是不能通過關鍵字new建立它的例項物件。列舉型別的列舉值 ZHANGSAN, LISI, WANGWU就是Student類的例項物件。

Student student = Student.WANGWU;//列舉成員預設都是public static final的(常量)。所以列舉類的列舉值全部大寫

注:

(1)在列舉聲明當中只允許public,不允許abstract和final修飾,列舉不能是抽象的,也不允許派生;

(2)enum關鍵字(小寫);

(3)任意兩個列舉體不能有相同的名字。

(三)訪問列舉的方式與靜態常量欄位相似

package practise;

enum Color{//定義列舉
    RED,GREEN,WHITE,BLACK
}

public class enum_test {
    public static void main(String[] args) {
        Color color = Color.BLACK;
        Color color1 = Color.GREEN;
        System.out.println(color.ordinal());//返回列舉序號
        System.out.println(color.toString());//返回列舉物件
        System.out.println(color.name());//列舉名

        System.out.println(Color.valueOf("RED"));
        System.out.println("====================");

        //?
        System.out.println(color.equals(color1));
        System.out.println(color == color1);

        System.out.println(color.compareTo(color1));//比較序號差值a.compareTo(b)    a的序號減去b的序號
        System.out.println(color1.compareTo(color));
        System.out.println("===================");

        System.out.println(color.getDeclaringClass());//列舉類的名字及路徑
        System.out.println("============");

        //.values() 把列舉的例項都變成一個數組,
        // 這個方法是由編譯器自己生成的靜態方法(原始碼中沒有)
        for (Color c:Color.values()) {
            System.out.println(c);
        }
        System.out.println("==============");

        Color[] colors = Color.values();
        for(int i = 0;i < colors.length;i ++){
            System.out.println(colors[i]);
        }

        Color color2 = Color.RED;
        switch (color){
            case RED:
                System.out.println("red");
                break;
            case GREEN:
                System.out.println("green");
                break;
            case WHITE:
                System.out.println("white");
                break;
            case BLACK:System.out.println("black");
                break;
        }

        //Color color3 = new Color();ERROR  列舉不能new
    }
}

二、宣告列舉型別的其它成員

包括構造方法、方法和資料成員。

列舉類的構造方法與一般類的構造方法不同,列舉類的構造方法只能是private(可以省略,預設為private),構造方法只是在構造列舉值的時候被呼叫。

package com.en;

enum Color_2{
    RED(255,0,0),GREEN(0,255,0),BIUE(0,0,255);
    private int redValue;
    private int greenValue;
    private int blueValue;
    private Color_2(int rv,int gv,int bv){
        this.redValue = rv;
        this.greenValue = gv;
        this.blueValue = bv;
    }

    public String toString(){
        return super.toString() + "(" + redValue + "," + greenValue + "," + blueValue + ")";
    }
}

public class TestEnum_2 {
    public static void main(String[] args) {
        Color_2 c = Color_2.BIUE;
        System.out.println(c);//隱式呼叫toString方法
        System.out.println(c.toString());//呼叫toString方法
    }
}

三、列舉類的成員方法

所有的列舉類都隱式地繼承於Enum類,所以所有的列舉類都繼承了Enum類的方法。宣告列舉型別時,編譯器會自動提供一些方法。

package com.en;

enum Student{
    ZHANGSAN,
    LISI,
    WANGWU;
}

public class TestEnum {
    public static void main(String[] args) {
        Student s = Student.WANGWU;//列舉成員預設都是public static final的(常量)。所以列舉類的列舉值全部大寫
        Student s1 = Student.ZHANGSAN;
        System.out.println(s.ordinal());//2     返回列舉常量的序號
        System.out.println(s.compareTo(s1));//2     s-s1
        System.out.println(s1.compareTo(s));//-2        s1-s  比較兩個列舉物件的序號
        System.out.println("===================");
        System.out.println(s.name());//WANGWU       返回該列舉常量的名字   (隱式呼叫toString方法)
        System.out.println(s1.toString());//ZHANGSAN       返回該列舉常量的名字
        System.out.println("===================");
        Student s2 = Student.valueOf("LISI");//返回指定名稱的指定列舉型別的列舉常量
        Student[] ss = Student.values();
        for(int i = 0;i < ss.length;i ++){
            System.out.println(ss[i]);
        }

        System.out.println("===================");

        for (Student s_1:Student.values()) {
            System.out.println(s_1);
        }
    }
}