Java學習系列(二十二)Java物件導向之枚舉詳解

來源:互聯網
上載者:User

標籤:對象   反射   枚舉   物件導向   enum   


轉載請註明出處:http://blog.csdn.net/lhy_ycu/article/details/45318621


一、前言 

今天我們來講講枚舉,希望通過這篇部落格大家能對枚舉有個更全面的瞭解。枚舉是一種執行個體(大寫)數固定的類(不能再建立執行個體),多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、類型數(如:系統、聊天、添加好友訊息,我的他的)、模式數(回複、評論模式,刷選、全部模式)等等。枚舉和類一樣,同樣有抽象類別、可以實現介面、可含內部類、初始化塊,值得注意的是:枚舉的構造器無論是否使用private修飾,預設總是被private修飾;當然,枚舉變數也可以在switch使用。下面我們通過執行個體來全面瞭解一下Java中的枚舉。


二、執行個體說明  (1)執行個體示範
/** * 修飾符 enum 枚舉名{ * //立即在第一行列出該枚舉的所有執行個體(但實際上是建立枚舉執行個體,會預設調用無參構造器)。  * } *  * @author [*昨日重現*] [email protected] * @since version 1.0 * @datetime 2015年4月27日 下午8:36:44 */public enum Gender {// MALE("男")相當於:Gender MALE = new Gender("男");// 列出所有枚舉值,也就是該枚舉所有可能的執行個體--執行個體列表// WOMENMALE其實預設就是WOMENMALE()MALE("男"), FEMALE("女"), MANMALE(), WOMENMALE;private String name;// --構造器無論是否使用private修飾,預設總是被private修飾Gender() {System.out.println("無參構造方法被調用...");}private Gender(String name) {System.out.println("含參構造方法被調用..." + name);this.name = name;}// 注意:初始化塊只能被static修飾。// 編譯時間執行個體初始化塊的代碼都會被提取到構造器的“最前面”,所以它執行的優先順序高於構造器{System.out.println("執行個體初始化塊....");}// 當類被載入後,對類初始化後時被隱式執行,且一個JVM對一個類只初始化一次。static {System.out.println("靜態/類初始化塊...");}public void info() {System.out.println(this + " 枚舉中的info方法被調用");}/** * 枚舉在switch中的使用 --switch(byte/short/char/int/String/枚舉) *  * @param gender */public static void chooseSex(Gender gender) {switch (gender) {// 傳一個枚舉變數給switchcase MALE:System.out.println("男性...");break;case FEMALE:System.out.println("女性...");break;case MANMALE:System.out.println("男同...");break;case WOMENMALE:System.out.println("女同...");break;default:break;}}class A {{System.out.println("A中執行個體初始化塊...");}public void info() {System.out.println(this + "A類中的info方法被調用");}}public static void main(String[] args) {// 初始化塊及構造器(無參或含參)按執行個體列表順序挨個被執行,接著執行靜態(類)初始化塊Gender g1 = Gender.MALE;Gender.chooseSex(g1);g1.info();// 建立寄生類(內部類)執行個體A a = g1.new A();a.info();// 列印該枚舉變數g1所在的執行個體列表所在的位置,從0開始System.out.println(g1.ordinal());// Gender g2 = Gender.FEMALE;// System.out.println(g2.ordinal());// 列印該枚舉的所有執行個體for (Gender g : Gender.values()) {System.out.println(g);}}}
========= 列印結果 =============
執行個體初始化塊....
含參構造方法被調用...男
執行個體初始化塊....
含參構造方法被調用...女
執行個體初始化塊....
無參構造方法被調用...
執行個體初始化塊....
無參構造方法被調用...
靜態/類初始化塊...
男性...
MALE 枚舉中的info方法被調用
A中執行個體初始化塊...
[email protected]類中的info方法被調用
0
MALE
FEMALE
MANMALE
WOMENMALE


(2)下面看看抽象枚舉的使用
// 編譯器將把註解資訊記錄在class檔案中,當運行Java程式時JVM會保留註解,因此可以通過反射機制來讀取註解的資訊。@Retention(RetentionPolicy.RUNTIME)// 註解作用在類上面@Target(ElementType.TYPE)public @interface ClassName {// 聲明預設值String name() default "計算";// 特殊的值String value();}

/** * 利用抽象枚舉來類比一個四則運算,需要建立匿名內部類來重寫相關抽象方法。 *  * @author [*昨日重現*] [email protected] * @since version 1.0 * @datetime 2015年4月27日 下午10:14:02 */// 指定用的是哪個自訂註解的類,若把name去掉,則name預設為:計算@ClassName(name = "枚舉", value = "四則運算")public enum Calculator {ADD("張三") {@Overridepublic double eval(double x, double y) {return x + y;}},SUB {@Overridepublic double eval(double x, double y) {return x - y;}},MULTIPLY {@Overridepublic double eval(double x, double y) {return x * y;}},DIVIDE {@Overridepublic double eval(double x, double y) {if (y == 0) {throw new ArithmeticException("除數不能為0");}return x / y;}};private String name;private Calculator() {System.out.println("無參構造器被執行..." + this);}private Calculator(String name) {this.name = name;System.out.println("含參構造器被執行..." + this.name);}public abstract double eval(double x, double y);public static void main(String[] args) throws ClassNotFoundException {Calculator c1 = Calculator.ADD;System.out.println(c1.eval(1, 2));// Calculator c2 = Calculator.SUB;// System.out.println(c2.eval(1, 2));// 列印該枚舉的一些註解資訊Class<?> clazz = Class.forName("com.leo.enumation.Calculator");ClassName cn = clazz.getAnnotation(ClassName.class);System.out.println(cn.name() + " ," + cn.value());}}

(3)枚舉實現介面
interface IDirection {void pointDirection();}/** * 枚舉實現介面 *  * @author [*昨日重現*] [email protected] * @since version 1.0 * @datetime 2015年4月27日 下午11:01:50 */public enum Orientation implements IDirection {EAST, WEST, SOUTH(), NORTH;@Overridepublic void pointDirection() {System.out.println("指向 ---> " + this);}public static void main(String[] args) {IDirection direction = Orientation.SOUTH;direction.pointDirection();}}

總結

 關於Java中的枚舉相關知識點大體就這些了,後面講陸續更新內部類、正則表示式、改善Java代碼品質的一些建議等等,敬請關注!


Java學習系列(二十二)Java物件導向之枚舉詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.