java 类型检查_Java开发笔记(五十二)对象的类型检查
前面介紹了類的多態(tài)性,來自于雞類的實(shí)例chicken,既能用來表達(dá)公雞實(shí)例,也能用來表達(dá)母雞實(shí)例。可是這導(dǎo)致了一個問題,假如在call方法內(nèi)部需要手工判斷輸入?yún)?shù)屬于公雞實(shí)例還是母雞實(shí)例,那該如何是好?所謂“雄兔腳撲朔,雌兔眼迷離,雙兔傍地走,安能辨我是雄雌”,固然編譯器在運(yùn)行之時能夠自動判斷這是哪種雞,可是若讓程序員自己辨別倒的確是件傷腦筋的事情。雖說傷腦筋,卻也并非無法實(shí)現(xiàn),粗略算來大致有三個辦法能派上用場,接下來分別進(jìn)行闡述。
第一個辦法,區(qū)別公雞和母雞,關(guān)鍵在于識別雞的性別。注意到Chicken雞類剛好有個性別類型字段sex,在公雞類中sex固定為0,在母雞類中sex固定為1。于是通過檢查chicken實(shí)例的sex屬性取值,即可判斷該實(shí)例屬于公雞類還是屬于母雞類。據(jù)此可編寫實(shí)例類型的鑒別方法,具體代碼如下:
// 通過屬性字段type檢查某實(shí)例的歸屬類
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("檢查類型字段:這既不是公雞也不是母雞。");
}
}
通過性別類型鑒定歸屬類,這種做法雖然在理論上可行,但事實(shí)上并不可靠。因?yàn)橐枪u實(shí)例的sex取值被意外篡改為1,那該公雞實(shí)例豈不是被誤判為母雞了?好比一只公雞做了變性手術(shù),難道它就變成母雞了嗎?篡改只能改變局部特征,并不能改變該事物的內(nèi)在本質(zhì),或者說,血液中流淌著的基因是無法改變的。只要DNA里面攜帶Y染色體,那么這只雞從根本上說就是公雞,而不管它外表上如何整形。
由此可見,依據(jù)基因檢測,才是檢查實(shí)例類型的可靠辦法。在Java代碼中,獲取某實(shí)例基因的手段是調(diào)用該實(shí)例的getClass方法,一旦獲得某只雞的基因,再跟公雞的基因和母雞的基因去比較,分分鐘就比較出結(jié)果了。對于公雞類Cock來說,它的基因可通過Cock.class提取;對于母雞類Hen來說,它的基因可通過Hen.class來提取。于是實(shí)例類型的鑒別過程便分解為兩個步驟:先調(diào)用實(shí)例的getClass方法得到它的基因,再將該基因與目標(biāo)基因進(jìn)行匹配操作,倘若匹配成功則表示二者是同一種類型。下面是按照基因匹配來檢查實(shí)例歸屬類的代碼例子:
// 通過類的基因檢查某實(shí)例的歸屬類
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("檢查對象的類名:這既不是公雞也不是母雞。");
}
}
上述的基因檢測手段很好很強(qiáng)大,然而其缺點(diǎn)也很明顯,就是太專業(yè)太啰嗦了。本來僅僅是個判斷實(shí)例類型的小事,何必要搞得興師動眾、追根溯源呢?因此Java專門提供了一個類型檢查的關(guān)鍵字instanceof,使用格式形如“A instanceof B”,意思是檢查A實(shí)例是否屬于B類型,該表達(dá)式返回true表示屬于,返回false表示不屬于。這樣關(guān)于雞類實(shí)例的類型判斷,借助于新關(guān)鍵字instanceof,又有了第三個鑒別辦法,詳細(xì)的鑒別代碼如下所示:
// 利用關(guān)鍵字instanceof檢查某實(shí)例的歸屬類
private static void checkInstance(Chicken chicken) {
if (chicken instanceof Cock) { // 判斷這只雞是不是公雞
System.out.println("檢查對象實(shí)例:這是只公雞。");
} else if (chicken instanceof Hen) { // 判斷這只雞是不是母雞
System.out.println("檢查對象實(shí)例:這是只母雞。");
} else {
System.out.println("檢查對象實(shí)例:這既不是公雞也不是母雞。");
}
}
可見利用instanceof判斷實(shí)例的類型,不但簡化了代碼的寫法,而且看起來也更易懂了。
總結(jié)
以上是生活随笔為你收集整理的java 类型检查_Java开发笔记(五十二)对象的类型检查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能 系统学习简介
- 下一篇: python笔记(摘抄廖雪峰python