1. 枚舉的由來 當我們知道所有變數的可能性時,儘量使用枚舉類型來定義,比如季節,春夏秋冬,一周(一二三四五六七),只讀不需要修改 有限的一個一個列舉出來的類叫做枚舉類,枚舉是一組常量的集合,枚舉也是一個特殊的類,裡面包含了一組有限的特定對象 2. 自定義實現枚舉 不需要提供set方法,因為枚舉對象 ...
1. 枚舉的由來
當我們知道所有變數的可能性時,儘量使用枚舉類型來定義,比如季節,春夏秋冬,一周(一二三四五六七),只讀不需要修改
有限的一個一個列舉出來的類叫做枚舉類,枚舉是一組常量的集合,枚舉也是一個特殊的類,裡面包含了一組有限的特定對象
2. 自定義實現枚舉
- 不需要提供set方法,因為枚舉對象值不能被修改(這裡註意枚舉一般只用於知道所有固定變數的值)
- 構造器私有化
- 枚舉對象/屬性用" final static""修飾
- 根據不同的類,生成不同數量的枚舉對象,而且枚舉對象定義全部大寫
引用前例子
這裡已知季節的所有變數是固定的春夏秋冬,可以用枚舉來寫
package EG.枚舉的由來;
//設置季節,春夏秋冬
public class Test {
public static void main(String[] args) {
/*
* 秋autumn
* 冬winter
* */
Season spring = new Season("春天","暖和");
Season summer = new Season("夏天","酷熱");
Season autumn = new Season("秋天", "涼爽至極");
Season winter = new Season("冬天", "冰冷刺骨");
System.out.println(spring);
}
}
package EG.枚舉的由來;
/**
* @author 簡水君
*/
public class Season {
/** 季節的名稱*/
private String name;
/** 季節的信息*/
private String desc;
//javaBean
public Season() {
}
public Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return name+"的特點: "+desc;
}
}
引用後例子
package EG.枚舉的由來.引用後;
//設置季節,春夏秋冬
public class Test {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
}
}
這裡模擬Season類繼承enum類稱為枚舉類,其次是季節都是固定的值,不能再次創建也不能修改,將構造器私有化,把set方法刪除,創建靜態對象
package EG.枚舉的由來.引用後;
/**
* @author 簡水君
*/
public class Season {
/**
* 季節的名稱
*/
private String name;
/**
* 季節的信息
*/
private String desc;
//javaBean
/** 這裡模擬Season類繼承enum類稱為枚舉類 */
public final static Season SPRING = new Season("春天", "暖和");
public final static Season SUMMER = new Season("夏天", "酷熱");
public final static Season AUTUMN = new Season("秋天", "涼爽至極");
public final static Season WINTER = new Season("冬天", "冰冷刺骨");
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return name + "的特點: " + desc;
}
}
3.枚舉的使用
定義枚舉用名詞enum
,第一行只能是常量(最終靜態/類的對象的縮寫),多個常量用逗號分隔,後面行隨意
格式:
- 無參時:
變數名1,變數名2,變數名3;
等價於變數n()
- 有參時;
變數名1(實參),變數名2(實參),變數名3(實參);
package EG.b枚舉的使用;
/**
* @author 簡水君
*/
//設置季節,春夏秋冬
public class Test {
public static void main(String[] args) {
System.out.println(Season.SPRING);
System.out.println(Season.SUMMER);
System.out.println(Season.SPRING);
System.out.println(Season.WINTER);
}
}
enum Season {
//這裡季節都是固定的值把set方法刪除
/* 這裡 SPRING("春天", "暖和")相當於 public final static Season SPRING = new Season("春天", "暖和"); 假設有個無參常量 SPRING,也是等價於SPRING()的*/
SPRING("春天", "暖和"),SUMMER("夏天", "酷熱"),AUTUMN("秋天", "涼爽至極"),WINTER("冬天", "冰冷刺骨");
//javaBean
/**
* 季節的名稱
*/
private String name;
/**
* 季節的信息
*/
private String desc;
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
@Override
public String toString() {
return name + "的特點: " + desc;
}
}
4.反編譯enum類
這裡 底層將該季節類Season為最終類,不能被繼承且繼承了Enum介面,有其方法values(),valueOf(),還有一個靜態代碼塊
練習題
這裡BOY,GIRL都是創建了無參的常量對象,這裡輸出boy指的是Boy的對象(類載入時載入一次靜態最終常量),但這裡沒有重寫Enum的toString()方法,所以指的是其常量名字,兩個引用指向一個對象
5.枚舉enum的方法
package EG.c枚舉方法的使用;
import java.util.Arrays;
/**
* @author 簡水君
*/
public class Test {
public static void main(String[] args) {
Season sp = Season.SPRING;
// 1. toString()這裡返回的是枚舉對象的名字 SPRING System.out.println(sp);
// 2. name()這裡返回的也是枚舉對象的名字 SPRING System.out.println(sp.name());
// 3.返回的是枚舉對象的索引位置 0 , 可以用於comparable比較
System.out.println(sp.ordinal());
// 4. values() 這裡返回的是一個枚舉的所有常量的數組
Season[] values = Season.values();
System.out.println(Arrays.toString(values));
// for( Season s : values ){}
// 5. valueOf(" ")獲取包含字元串的常量對象
Season sa = Season.valueOf("WINTER");
System.out.println(sa);
// 6.CompareTo: 比較兩個枚舉常量,比較的是編號的差值,底層是兩者調用ordinal方法的差值,這可以算出兩個常量位置的差值
//春天和冬天的差值0-3
int i = Season.SPRING.compareTo(Season.WINTER);
System.out.println(i);
}
}
enum Season {
SPRING("春天", "暖和"), SUMMER("夏天", "酷熱"), AUTUMN("秋天", "涼爽至極"), WINTER("冬天", "冰冷刺骨");
private String name;
private String desc;
private Season() {
}
private Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
例子
package EG.d練習題;
import java.util.Arrays;
import java.util.PropertyResourceBundle;
/**
* @author 簡水君
*/
public class Test {
public static void main(String[] args) {
//獲取所有的常量數組,遍歷
Week[] values = Week.values();
System.out.println("所有星期信息如下: ");
for (Week value : values) {
System.out.print(value+" ");
}
}
}
/**
因為我們知道一周所有變數固定的值,所以用枚舉來寫,而且各個變數不給改變,
而且定義的Week的是最終類,不給繼承,但可以創建對象
*/
enum Week{
MONDAY("周一"),TUESDAY("周二"),WEDNESDAY("周三"),THURSDAY("周四"),FRIDAY("周五"),SATURDAY("周六"),SUNDAY("周末");
private String name;
private Week() {
}
private Week(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
6.枚舉實現介面
- 使用enum關鍵字後,就不能再繼承其他類了,但enum定義的類底層會繼承Enum介面,這算是java的單繼承機制了
- 枚舉類和普通類一樣,可以實現介面,如下形式
enum 類名 implements 介面1,介面2{}
,多幾個義父
package EG.e枚舉實現介面;
public class Test {
public static void main(String[] args) {
// 調用枚舉的方法
Music.GUANGHUISUIYUE.play();
}
}
enum Music implements Play{
//定義一個音樂對象
GUANGHUISUIYUE;
@Override
public void play() {
//列印常量的名稱
System.out.println("正在播放