枚舉是JDK1.5以後提供的新特性。枚舉是一個特殊的類, 其中的每一個元素都是該類的一個對象。
枚舉就相當於一個類,其中也可以有構造方法,成員變量,普通方法和抽象方法。注:枚舉元素必須位於枚舉的最開始部分,枚舉元素之間用逗號隔開,結尾用";"分號與其他成員隔開。
枚舉的構造方法:
一,枚舉的構造方法必須是私有的,二,枚舉元素如果後面不加帶參的括號,則默認調用無參構造方法。
作用:枚舉就要讓某個類型的變量的取值只能爲若干個固定值中的一個, 否則編譯錯誤。
比如:一週只能有星期一到星期天7天。
枚舉類的方法:
String name() 返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。
int ordinal() 返回身在枚舉中的位置。static valueOf(String name) 返回帶指定名稱的枚舉常量。
values() 返回的是枚舉的所有元素的一個數組。定義枚舉的語法:用enum關鍵字
訪問修飾符 enum 枚舉名稱{}
枚舉中重寫了toString方法,其默認返回值是枚舉元素的名稱。
枚舉的示例代碼:
package com.itheima.io.file;
/**
* 交通燈模擬
* @author wuyong
*
*/
public class LampDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//打印出枚舉的所有元素:
System.out.println("===========Values=============");
Lamp[] lamps = Lamp.values();
for (Lamp lamp : lamps) {
System.out.println(lamp.name());
}
//輸出對應名稱的元素
System.out.println("===========Value=============");
System.out.println(Lamp.valueOf("RED"));
System.out.println("=============模擬=================");
//下一個燈
Lamp nextLamp = null;
//紅燈,及下一個燈
System.out.println(Lamp.RED + "亮了" + Lamp.RED.time + "秒");
nextLamp = Lamp.RED.nextLamp();
System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
//黃燈,及下一個燈
nextLamp = Lamp.YELLOW.nextLamp();
System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
//綠燈,及一個燈
nextLamp = Lamp.GREEN.nextLamp();
System.out.println(nextLamp + "亮了" + nextLamp.time + "秒");
}
public enum Lamp{
//紅燈
RED(15) {
@Override
Lamp nextLamp() {
return YELLOW;
}
public String toString(){
System.out.print("紅燈");
return "";
}
},
//黃燈
YELLOW(3) {
@Override
Lamp nextLamp() {
return GREEN;
}
public String toString(){
System.out.print("黃燈");
return "";
}
},
//綠
GREEN(15) {
@Override
Lamp nextLamp() {
return RED;
}
public String toString(){
System.out.print("綠燈");
return "";
}
};
//構造方法,跳轉到下一個燈,交由每個燈自己去實現。
abstract Lamp nextLamp();
//燈亮的時間
private int time;
//構造函數
private Lamp(){}
private Lamp(int time){this.time = time;}
}
}
用普通類模擬枚舉的功能:
步驟:
1,將構造函數私有;2,自定義固定個數的本來對象的靜態常量,並初始化對象;
示例代碼:
package com.itheima.io.file;
/**
* 用普通類實現枚舉的功能
* @author wuyong
*
*/
public class EnumClassDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(EnumClass.LOCK);
System.out.println(EnumClass.UNLOCK);
EnumClass.LOCK.isLock();
EnumClass.UNLOCK.isLock();
}
}
/**
* 普通類模擬枚舉的功能
* @author wuyong
*
*/
abstract class EnumClass{
private EnumClass(){};
public static final EnumClass LOCK = new EnumClass() {
@Override
void isLock() {
System.out.println("鎖鎖上了");
}
};
public static final EnumClass UNLOCK = new EnumClass() {
@Override
void isLock() {
System.out.println("鎖打開了");
}
};
abstract void isLock();
}
package com.itheima.io.file;
/**
* 枚舉的單例模式
* @author wuyong
*
*/
public class EnumSingleDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Single single1 = Single.SINGLE;
Single single2 = Single.SINGLE;
System.out.println("single1 == single2 : " + (single1 == single2));
System.out.println("single1.hashCode == single2.hashCode : " + (single1.hashCode() == single2.hashCode()));
}
public enum Single{
SINGLE{
@Override
void address() {
System.out.println(this.hashCode());
}
};
abstract void address();
}
}