1. 程式人生 > >Java開發筆記(四十八)類的簡單繼承

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

生活 包含 重寫 一個 意思 .html 系列 highlight 輸出結果

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

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聲明一只鴿子的實例,則相關的調用代碼如下所示:

		// 創建一個鳥類的實例
		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類一樣的用法,比如下面代碼演示了如何創建燕子類的實例、以及如何調用該實例的方法:

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

運行上面的演示代碼,可以看到下述的日誌信息:

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

由此可見Swallow類的確完整繼承了Bird類的所有成員。



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

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