Java開發筆記(四十八)類的簡單繼承

前面介紹了類的基本用法,主要是如何封裝一個類的各項要素,包括成員屬性、成員方法、構造方法等,想必你們對類的簡單運用早已得心應手。所謂「物以類聚,人以羣分」,之因此某些事物會聚在一塊兒,乃是由於它們擁有相似的品性。那麼面向對象的目的,就是將一羣事物之間共同的行爲特徵提煉出來,從而概括爲具備普適性的類型。像平常生活中說的昆蟲、魚類、鳥類,即是人們把外表類似、習性相近的一系列動物歸類的結果。
以鳥類爲例,按照科學家的定義,它們是動物界→脊索動物門→鳥綱下面全部動物的總稱。假若按照大衆的觀點,鳥類爲長着一對翅膀和兩條腿的有羽動物的統稱,特別是羽毛把鳥類與各類昆蟲以及蝙蝠區別開來。假設如今有一羣鳥類,須要經過幾項特徵將它們區分開,則可提問幾個爲何,諸如它的名稱是什麼、它的叫聲是什麼、它的性別是什麼等等。這些用來區別鳥兒個體的特徵,對應於面向對象理論的屬性概念,那麼在Java編程之中,能夠設計一個名叫Bird的鳥類,並給Bird類定義名稱、叫聲、性別等成員屬性,以及讀寫屬性的成員方法,如此便構成了程序世界裏面的鳥類定義。
至於Bird類的具體定義,相信你們參照以前的類封裝,便可輕車熟路填寫其中的成員屬性、成員方法,乃至構造方法等要素。下面是一個Bird類的詳細定義代碼例子:html

public class Bird {
	// 定義鳥的名稱
	private String name;
	// 定義鳥的叫聲
	private String voice;
	// 定義鳥的性別類型。0表示雄性,1表示雌性
	private int sexType;
	// 定義鳥的性別名稱
	private String sexName;
	
	// 鳥類的構造方法(無任何輸入參數)
	public Bird() {
		this.name = "鳥";
	}

	// 鳥類的構造方法(輸入參數包含:名稱、性別、叫聲)
	public Bird(String name, int sexType, String voice) {
		this.name = name;
		this.voice = voice;
		setSexType(sexType); // 該方法內部同時修改性別類型和性別名稱
	}
	
	// 設置鳥的名稱
	public void setName(String name) {
		this.name = name;
	}

	// 獲取鳥的名稱
	public String getName() {
		return this.name;
	}

	// 設置鳥的叫聲
	public void setVoice(String voice) {
		this.voice = voice;
	}

	// 獲取鳥的叫聲
	public String getVoice() {
		return this.voice;
	}

	// 設置鳥的性別類型,並自動調整性別名稱
	public void setSexType(int sexType) {
		this.sexType = sexType;
		this.sexName = (sexType==0) ? "雄" : "雌";
	}

	// 獲取鳥的性別類型
	public int getSexType() {
		return this.sexType;
	}

	// 獲取鳥的性別名稱
	public String getSexName() {
		return this.sexName;
	}

	// 輸出鳥類的基本信息描述文字
	public String toString() {
		String desc = String.format("這是一隻%s%s,它會%3$s、%3$s地叫。", 
				this.sexName, this.name, this.voice);
		return desc;
	}
}

有了上面的鳥類定義,而後外部才能循序漸進地使用Bird類,譬如經過Bird聲明一隻鴿子的實例,則相關的調用代碼以下所示:java

		// 建立一個鳥類的實例
		Bird pigeon = new Bird();
		pigeon.setName("鴿子");
		pigeon.setSexType(1);
		pigeon.setVoice("咕咕");
		System.out.println(pigeon.toString());

 

運行以上的代碼例子,可觀察到如下的日誌輸出結果:編程

這是一隻雌鴿子,它會咕咕、咕咕地叫。

 

但是鴿子並不是單獨的一種鳥類,而是鳥綱→鴿形目→鳩鴿科→鴿屬下面全部鴿類的統稱,包括家鴿、巖鴿、銀鴿、雪鴿、斑鴿、黃腿鴿、白頭鴿等等,這些鴿類動物相互之間具有更接近的習性特徵,理應擁有本身的類定義如Pigeon類。
考慮到全部的鳥類動物都存在大類之下再分小類的需求,小類在大類的基礎上再體現本類的特點屬性,故而定義小類之時沒必要另起爐竈,徹底能夠基於大類而後修修補補造成新的小類定義。這種小類基於大類的關係,在面向對象體系中被稱做「繼承」,意思是小類繼承了大類的全部成員,大類更專業的稱呼叫「基類」,基於大類的小類也被起了個大名叫作「派生類」。
如今就之前述的Bird爲基類,給它擴展出一個新的派生類Swallow(燕子類),準備把鳥綱→雀形目→燕科下面的家燕、雨燕、金絲燕等包羅在內。Java代碼中表示繼承關係的關鍵字是extends,從A類派生出B類的寫法爲「class B extends A」,其他的類定義框架保持不變。因而從Bird派生而來的Swallow類定義代碼示例以下:框架

//定義了一個繼承自鳥類的燕子類
public class Swallow extends Bird {
	// 燕子類未重寫任何構造方法,則默認使用不帶輸入參數的構造方法
}

 

僅僅看Swallow類的代碼定義,發現內部空空如也,其實它早已繼承了Bird類的全部成員屬性和成員方法,以及默認的構造方法。外部使用Swallow類的時候,就像操做Bird類同樣的用法,好比下面代碼演示瞭如何建立燕子類的實例、以及如何調用該實例的方法:this

		// Swallow類使用不帶任何參數的默認構造方法
		Swallow swallow = new Swallow();
		swallow.setName("燕子");
		swallow.setSexType(0);
		swallow.setVoice("啾啾");
		System.out.println(swallow.toString());

 

運行上面的演示代碼,能夠看到下述的日誌信息:設計

這是一隻雄燕子,它會啾啾、啾啾地叫。

 

因而可知Swallow類的確完整繼承了Bird類的全部成員。日誌



更多Java技術文章參見《Java開發筆記(序)章節目錄orm

相關文章
相關標籤/搜索