1. 程式人生 > >Java學習系列(二十二)Java面向物件之列舉詳解

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


一、前言 

今天我們來講講列舉,希望通過這篇部落格大家能對列舉有個更全面的瞭解。列舉是一種例項(大寫)數固定的類(不能再建立例項),列舉改變了常量的宣告方式,而且它在編譯期間就限定了型別。列舉多用於確定的狀態數(如:滑鼠上下左右、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) {
		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) 掌握