Java開發筆記(五十二)對象的類型檢查

前面介紹了類的多態性,來自於雞類的實例chicken,既能用來表達公雞實例,也能用來表達母雞實例。但是這致使了一個問題,假如在call方法內部須要手工判斷輸入參數屬於公雞實例仍是母雞實例,那該如何是好?所謂「雄兔腳撲朔,雌兔眼迷離,雙兔傍地走,安能辨我是雄雌」,當然編譯器在運行之時可以自動判斷這是哪一種雞,但是若讓程序員本身辨別倒的確是件傷腦筋的事情。雖然說傷腦筋,卻也並不是沒法實現,粗略算來大體有三個辦法能派上用場,接下來分別進行闡述。
第一個辦法,區別公雞和母雞,關鍵在於識別雞的性別。注意到Chicken雞類恰好有個性別類型字段sex,在公雞類中sex固定爲0,在母雞類中sex固定爲1。因而經過檢查chicken實例的sex屬性取值,便可判斷該實例屬於公雞類仍是屬於母雞類。據此可編寫實例類型的鑑別方法,具體代碼以下:html

	// 經過屬性字段type檢查某實例的歸屬類
	private static void checkType(Chicken chicken) {
		if (chicken.sex == 0) { // 判斷性別是否爲雄性
			System.out.println("檢查類型字段:這是隻公雞。");
		} else if (chicken.sex == 1) { // 判斷性別是否爲雌性
			System.out.println("檢查類型字段:這是隻母雞。");
		} else {
			System.out.println("檢查類型字段:這既不是公雞也不是母雞。");
		}
	}

 

經過性別類型鑑定歸屬類,這種作法雖然在理論上可行,但事實上並不可靠。由於要是公雞實例的sex取值被意外篡改成1,那該公雞實例豈不是被誤判爲母雞了?比如一隻公雞作了變性手術,難道它就變成母雞了嗎?篡改只能改變局部特徵,並不能改變該事物的內在本質,或者說,血液中流淌着的基因是沒法改變的。只要DNA裏面攜帶Y染色體,那麼這隻雞從根本上說就是公雞,而無論它外表上如何整形。
因而可知,依據基因檢測,纔是檢查實例類型的可靠辦法。在Java代碼中,獲取某實例基因的手段是調用該實例的getClass方法,一旦得到某隻雞的基因,再跟公雞的基因和母雞的基因去比較,分分鐘就比較出結果了。對於公雞類Cock來講,它的基因可經過Cock.class提取;對於母雞類Hen來講,它的基因可經過Hen.class來提取。因而實例類型的鑑別過程便分解爲兩個步驟:先調用實例的getClass方法獲得它的基因,再將該基因與目標基因進行匹配操做,假若匹配成功則表示兩者是同一種類型。下面是按照基因匹配來檢查實例歸屬類的代碼例子:java

	// 經過類的基因檢查某實例的歸屬類
	private static void checkClass(Chicken chicken) {
		if (chicken.getClass().equals(Cock.class)) { // 判斷這隻雞的DNA是否是公雞DNA
			System.out.println("檢查對象的類名:這是隻公雞。");
		} else if (chicken.getClass().equals(Hen.class)) { // 判斷這隻雞的DNA是否是母雞DNA
			System.out.println("檢查對象的類名:這是隻母雞。");
		} else {
			System.out.println("檢查對象的類名:這既不是公雞也不是母雞。");
		}
	}

 

上述的基因檢測手段很好很強大,然而其缺點也很明顯,就是太專業太囉嗦了。原本僅僅是個判斷實例類型的小事,何須要搞得興師動衆、追根溯源呢?所以Java專門提供了一個類型檢查的關鍵字instanceof,使用格式形如「A instanceof B」,意思是檢查A實例是否屬於B類型,該表達式返回true表示屬於,返回false表示不屬於。這樣關於雞類實例的類型判斷,藉助於新關鍵字instanceof,又有了第三個鑑別辦法,詳細的鑑別代碼以下所示:程序員

	// 利用關鍵字instanceof檢查某實例的歸屬類
	private static void checkInstance(Chicken chicken) {
		if (chicken instanceof Cock) { // 判斷這隻雞是否是公雞
			System.out.println("檢查對象實例:這是隻公雞。");
		} else if (chicken instanceof Hen) { // 判斷這隻雞是否是母雞
			System.out.println("檢查對象實例:這是隻母雞。");
		} else {
			System.out.println("檢查對象實例:這既不是公雞也不是母雞。");
		}
	}

 

可見利用instanceof判斷實例的類型,不但簡化了代碼的寫法,並且看起來也更易懂了。htm



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

相關文章
相關標籤/搜索