Java學習系列(二十二)Java面向物件之列舉詳解
一、前言
今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、型別數(如:系統、聊天、新增好友訊息,我的他的)、模式數(回覆、評論模式,刷選、全部模式)等等。列舉和類一樣,同樣有抽象類、可以實現介面、可含內部類、初始化塊,值得注意的是:列舉的構造器無論是否使用private修飾,預設總是被private修飾;當然,列舉變數也可以在switch使用。下面我們通過例項來全面瞭解一下Java中的列舉。
二、例項說明
/** * 修飾符 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) { if (gender == null) { return; } switch (gender) {// 傳一個列舉變數給switch case 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("張三") {
@Override
public double eval(double x, double y) {
return x + y;
}
},
SUB {
@Override
public double eval(double x, double y) {
return x - y;
}
},
MULTIPLY {
@Override
public double eval(double x, double y) {
return x * y;
}
},
DIVIDE {
@Override
public 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;
@Override
public void pointDirection() {
System.out.println("指向 ---> " + this);
}
public static void main(String[] args) {
IDirection direction = Orientation.SOUTH;
direction.pointDirection();
}
}
三、總結
關於Java中的列舉相關知識點大體就這些了,後面講陸續更新內部類、正則表示式、改善Java程式碼質量的一些建議等等,敬請關注!
相關推薦
Java學習系列(二十二)Java面向物件之列舉詳解
一、前言 今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、IM訊息已讀未讀)、型別數(如:系統
Java學習系列(二十一)Java面向物件之註解詳解
一、前言 Java中的註解Annotation運用到很多方面,比如之前講的單元測試中的@Test、Spring、SpringMVC還有其他框架等等。Java本身自帶的註解也有一些,比如:@Override(子類要重寫/覆寫父類的對應方法)、@Deprecated(表
Java學習筆記(5):3.面向物件之方法詳解
方法是類或物件的行為特徵的抽象,方法是類或物件最重要的組成成分。但從功能上看,方法完全類似於傳統結構化程式設計裡的函式。值得指出的是,Java裡的方法不能獨立存在,所有的方法必須定義在類裡。方法在邏輯上要麼屬於類,要麼屬於物件。 1.方法的所屬性 永遠不要把方法當成
Java面向物件之異常詳解
目錄 Java面向物件之異常【一】 Java面向物件之異常【二】 捕獲異常的規則 訪問異常資訊 異常對方法重寫的影響 finally詳解
Java學習系列(二十三)Java面向物件之內部類詳解
一、前言 內部類也稱寄生類,就是把一個類放在類裡面(即內部類的上一級程式單元是類)定義,將其作為外部類的成員。內部類主要用幾種定義形式:靜態(static)內部類,非靜態內部類,匿名內部類(也就是沒有名字的寄生類)。內部類的好處就是內部類可以直接外部類的(包括私有)
java學習筆記(十)-- java新特性 (列舉 & 註解 & 介面定義加強 & Lambda表示式)
列舉 (enum) 高階的多例模式 java中列舉使用enum關鍵字定義列舉 列舉就是一種多例設計模式 enmu Color{ RED,BLUE,GREEN; } enum Color{
Swift 學習之二十一:?和 !(詳解)
新更新的內容請移步閱讀: Swift語言使用var定義變數,但和別的語言不同,Swift裡不會自動給變數賦初始值, 也就是說變數不會有預設值,所以要求使用變數之前必須要對其初始化 。如果在使用變數之前不進行初始化就會報錯: var stringValue : Stri
osgEarth的Rex引擎原理分析(二十一)建立瓦片模型過程詳解
目標:(十七)中問題47 osgEarth/TerrainTileModelFactory.cpp TerrainTileModel* TerrainTileModelFactory::createTileModel(const MapFrame& fr
從壹開始前後端分離 [ Vue2.0+.NET Core2.1] 二十║Vue基礎終篇:元件詳解+專案說明
緣起 新的一天又開始啦,大家也應該看到我的標題了,是滴,Vue基礎基本就到這裡了,咱們回頭看看這一路,如果你都看了,並且都會寫了,那麼現在你就可以自己寫一個Demo了,如果再瞭解一點路由,ajax請求(這裡是axios),那麼你就可以準備面試前端了,哈哈,當然沒有這麼誇張,往後的路還很長,至少咱們基礎都會了
python快速學習系列(6):面向物件程式設計(OOP)
一、面向物件程式設計: 1.比設計模式更重要的是設計原則: 1)面向物件設計的目標: ·可擴充套件:新特性很容易新增到現有系統中,基本不影響系統原有功能 ·可修改:當修改某一部分程式碼時,不會影響到其他不相關的部分 ·可替代:用具有相同介面的程式碼去替換系統中某一部分程式碼時,系統不受影
【python資料探勘課程】二十.KNN最近鄰分類演算法分析詳解及平衡秤TXT資料集讀取
這是《Python資料探勘課程》系列文章,也是我這學期上課的部分內容及書籍的一個案例。本文主要講述KNN最近鄰分類演算法、簡單實現分析平衡秤資料集,希望這篇文章對大家有所幫助,同時提供些思路。內容包括:
面向物件七大原則詳解
單一職責原則 定義:一個類只負責一個領域的相應職責。 開閉原則 定義:軟體實體應對擴充套件開放,而對修改關閉。 里氏替換原則 定義:所有引用基類的物件能夠透明的使用其子類的物件。 依賴倒轉原則 定義:抽象
三十一、併發程式設計之FutureTask詳解
一、Future是一個介面,它定義了5個方法 boolean cancel(boolean mayInterruptInRunning) //取消一個任務,並返回取消結果。引數表示是否中斷執行緒。 boolean isCancelled() //判斷任務是否被取消 Boolean isD
Spring MVC學習總結(14)——SpringMVC測試框架之mockMVC詳解
SpringMVC測試框架 基於RESTful風格的SpringMVC的測試,我們可以測試完整的Spring MVC流程,即從URL請求到控制器處理,再到檢視渲染都可以測試。 一 MockMvcBuilder MockMvcBuilder是用來構造MockMvc的構造器,其主要有兩個實現:Standalone
Java學習筆記二十一:Java面向對象的三大特性之繼承
類構造 接下來 多重 通過 prot 圖片 等級 ++ class Java面向對象的三大特性之繼承 一:繼承的概念; 繼承是java面向對象編程技術的一塊基石,因為它允許創建分等級層次的類。 繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父
徐思201771010132《面向物件程式設計(Java)》第十二週學習總結
一、理論知識部分 Java的抽象視窗工具箱(Abstract Window Toolkit, AWT)包含在java.awt包中,它提供了許多用來設計GUI的元件類和容器類。 大部分AWT元件都有其Swing的等價元件,Swing元件的名字一般是在AWT元件名前面新增一個字母“J”。 通常把由Compo
徐思201771010132《面向對象程序設計(Java)》第十二周學習總結
bound 大學 closed color 獲得 ase extends -c 嵌套 一、理論知識部分 Java的抽象窗口工具箱(Abstract Window Toolkit, AWT)包含在java.awt包中,它提供了許多用來設計GUI的組件類和容器類。 大部分AWT
王穎奇 20171010129《面向物件程式設計(java)》第十二週學習總結
實驗十二 圖形程式設計 理論: 10.1 AWT與Swing簡介 10.2 框架的建立10.3 圖形程式設計10.4 顯示影象 (具體學習總結在最後) 實驗: 實驗時間 2018-11-14 1、實驗目的與要求 (1) 掌握Java GUI中
201771010112羅松《面向對象程序設計(java)》第十二周學習總結
java gui 橢圓 rectangle 平臺 img 思考 完成 通過 blog 一、實驗目的與要求 (1) 掌握Java GUI中框架創建及屬性設置中常用類的API; (2) 掌握Java GUI中2D圖形繪制常用類的API; (3) 了解Java GUI中2D圖形中
張季躍 201771010139《面向對象程序設計(java)》第十二周學習總結
ssa 調試 rap 二周 掌握 pac 屬性 center 代碼註釋 張季躍 201771010139《面向對象程序設計(java)》第十二周學習總結 第二部分:實驗部分 1、實驗目的與要求 (1) 掌握Java GUI中框架創建及屬性設置中常用類的API; (2) 掌握