含義:一種類似于類的一種結構
作用:是Java提供的一個數據類型,可以設置值是固定的
【當某一個數據類型受自身限制的時候,使用枚舉】
語法格式:
public enum 枚舉名{……
}
有哪些成員?
A、對象
public enum EnumDemo {/*** 對象** 對象是直接在枚舉類中* 全大寫默認是對象* 底層語法格式默認 public static final 枚舉名 對象名 = new 枚舉名();* 默認調用的無參構造* 定義多個對象時以逗號隔開分號結尾 對象1,對象2,對象3,對象4……;*/UPPER;
}
如何調用對象?
public class EnumDemoTest {public static void main(String[] args) {//直接打印輸出 【枚舉名.對象名】 默認打印結果是對象名System.out.println(EnumDemo.UPPER);//UPPER}
}
注意:這里打印的對象不是地址,默認打印對象名,因為其實它默認重寫了toString方法,手動重寫會打印對象構造方法中的值
B、字段【非靜態和靜態】
前提:從上自下,先有對象,再有字段;有字段無對象會編譯錯誤
public enum EnumDemo {/*** 字段** 1.數據類型 字段名;** 2.static 數據類型 字段名;*/UPPER;String centre;static String centre1;
}
如何調用字段?
public class EnumDemoTest {public static void main(String[] args) {//調用非靜態字段【枚舉名.對象名.非靜態字段名】EnumDemo.UPPER.centre = "aa";System.out.println(EnumDemo.UPPER.centre);//aa//調用靜態字段【枚舉名.靜態字段名】EnumDemo.centre1 = "AA";System.out.println(EnumDemo.centre1);//AA}
}
C、構造方法
默認都是 私有的
public enum EnumDemo {/*** 構造方法** 1.無參構造** 2.有參構造【直接此枚舉對象中 對象名("字段類型值")】** 對象默認使用無參** 當有了有參構造,也必須要有無參構造**/UPPER,UPPER1("!"),UPPER2("!",100);String centre;static String centre1;//默認構造方法被private修飾,也只能用它來修飾EnumDemo(){System.out.println("無參構造!");}EnumDemo(String name){System.out.println("有參構造"+name);}EnumDemo(String name,int morey){System.out.println("有參構造"+name+"--"+morey);}}
如何調用構造方法?
public class EnumDemoTest {public static void main(String[] args) {//調用無參構造EnumDemo upper = EnumDemo.UPPER;//就是這樣就會打印:無參構造!//調用有參構造(形參列表個數1)EnumDemo upper1 = EnumDemo.UPPER;//就是這樣就會打印:有參構造!//調用有參構造(形參列表個數2……)EnumDemo upper2 = EnumDemo.UPPER;//就是這樣就會打印:有參構造!--100}
}
由此可以看出,每個對象都能共享枚舉里面的其它成員
這里重寫toString方法呢?
public enum EnumDemo {/*** 構造方法** 1.無參構造** 2.有參構造【直接此枚舉對象中 對象名("字段類型值")】** 對象默認使用無參** 當有了有參構造,也必須要有無參構造**/UPPER,UPPER1("!"),UPPER2("!",100);String name;int morey;static String centre1;//默認構造方法被private修飾,也只能用它來修飾EnumDemo(){System.out.println("無參構造!");}EnumDemo(String name){System.out.println("有參構造"+name);}EnumDemo(String name,int morey){//給set/get方法、toString方法this.name = name;this.morey = morey;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getMorey() {return morey;}public void setMorey(int morey) {this.morey = morey;}public static String getCentre1() {return centre1;}public static void setCentre1(String centre1) {EnumDemo.centre1 = centre1;}@Overridepublic String toString() {return "EnumDemo{" +"name='" + name + '\'' +", morey=" + morey +'}';}
}
/*** 調用 UPPER2對象 有參構造*/
public class EnumDemoTest {public static void main(String[] args) {//調用無參構造EnumDemo upper = EnumDemo.UPPER;//就是這樣就會打印:無參構造!//調用有參構造(形參列表個數1)EnumDemo upper1 = EnumDemo.UPPER;//就是這樣就會打印:有參構造!//調用有參構造(形參列表個數2……)EnumDemo upper2 = EnumDemo.UPPER2;System.out.println(upper2);//EnumDemo{name='!', morey=100}}
}
D、方法
public enum EnumDemo {/*** 方法** 1.非靜態方法** 2.靜態方法*/UPPER;void method1(){System.out.println("非靜態方法!");}static void method2(){System.out.println("靜態方法!");}
}
如何調用方法?
public class EnumDemoTest {public static void main(String[] args) {//調用非靜態方法【對象名.對象名.非靜態方法】EnumDemo.UPPER.method1();//非靜態方法!//調用靜態方法【枚舉名.靜態方法名】EnumDemo.method2();//靜態方法!}
}
枚舉的繼承
(Enum)是所有枚舉類的基類,都隱式繼承了Enum,只能隱式繼承,不能顯示繼承
為何打印對象的時候不是直接打印的地址而是打印的對象名?
java.lang.Object 【所有類的基類,toString方法】└ java.lang.Enum<E> 【所有枚舉類的基類】【因為Enum繼承了Object類,重寫了toString方法】└ 自定義的枚舉類 【所以打印對象是其對象名,而不是地址】
使用場景
一般使用在值比較固定的地方,常和switch一起使用