Java 強制類型轉(zhuǎn)換(學(xué)習(xí) Java 編程語言 044)

將一個類型強制轉(zhuǎn)換成另外一個類型的過程被稱為強制類型轉(zhuǎn)換。Java 程序設(shè)計語言提供了一種專門用于進行強制類型轉(zhuǎn)換的表示法疆液。
?double x = 3.405;
?int nx = (int) x;
將表達(dá)式 x 的值轉(zhuǎn)換成整數(shù)類型鲜漩,舍棄了小數(shù)部分暇务。

正像有時候需要將浮點數(shù)轉(zhuǎn)換成整數(shù)一樣科平,有時候也可能需要將某個類的對象引用轉(zhuǎn)換成另外一個類的對象引用铃辖。要完成對象引用的強制類型轉(zhuǎn)換,轉(zhuǎn)換語法與數(shù)值表達(dá)式的強制類型轉(zhuǎn)換類似窖梁,僅需要用一對圓括號將目標(biāo)類名括起來晃酒,并放置在需要轉(zhuǎn)換的對象引用之前就可以了。

public class Manager extends Employee {
    ...
}
Employee[] staff = new Employee[3];
staff[0] = new Manager("Carl Cracker", 75000, 1987, 12, 15);
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

// 強制類型轉(zhuǎn)換
Manager boss = (Manager)staff[0];

進行強制類型轉(zhuǎn)換的唯一原因是: 要在暫時忽視對象的實際類型之后使用對象的全部功能窄绒。例如,由于某些元素是普通員工崔兴,所以 staff 數(shù)組必須是 Employee 對象的數(shù)組彰导。我們需要將數(shù)組中引用經(jīng)理的元素復(fù)原成 Manage 對象,以便能夠訪問新增加的所有變量敲茄。

在 Java中位谋,每個對象變量都有一個類型。類型描述了這個變量所引用的以及能夠引用的對象類型堰燎。例如掏父,staff[i] 引用了一個 Employee 對象(因此它還可以引用 Manager 對象)。

將一個值存入變量時秆剪,編譯器將檢查你是否承諾過多赊淑。如果將一個子類的引用賦給一個超類變量,編譯器是允許的仅讽。但將一個超類的引用賦給一個子類變量時陶缺,就承諾過多了。必須進行強制類型轉(zhuǎn)換洁灵,這樣才能夠通過運行時的檢査饱岸。

如果試圖在繼承鏈上進行向下的強制類型轉(zhuǎn)換,并且 “謊報” 對象包含的內(nèi)容,會發(fā)生什么情況呢苫费?
?Manager boss = (Manager) staff[1] ; // Error
運行這個程序時谅河,Java 運行時系統(tǒng)將注意到你的承諾不符,并產(chǎn)生一個 ClassCastException 異常莺掠。如果沒有捕獲這個異常料扰,那么程序就會終止。因此琅翻,應(yīng)該養(yǎng)成這樣一個良好的程序設(shè)計習(xí)慣:在進行類型轉(zhuǎn)換之前位仁,先查看是否能夠成功地轉(zhuǎn)換。為此只需要使用 instanceof 操作符就可以實現(xiàn)方椎。例如:

if(staff[1] instanceof Manager) {
    boss = (Manager) staff[1];
    ...
}

最后聂抢,如果這個類型轉(zhuǎn)換不可能成功,編譯器就不會讓你完成這個轉(zhuǎn)換棠众。例如琳疏,下面這個強制類型轉(zhuǎn)換:
?String c = (String) staff[1];
將會產(chǎn)生編譯錯誤,這是因為 String 不是 Employee 的子類闸拿。

強制類型轉(zhuǎn)換注意事項:

  • 只能在繼承層次內(nèi)進行強制類型轉(zhuǎn)換空盼。
  • 在將超類強制轉(zhuǎn)換成子類之前,應(yīng)該使用 instanceof 進行檢查新荤。

如果 x 為 null揽趾,進行以下測試
?x instanceof C
不會產(chǎn)生異常,只是返回 false苛骨。之所以這樣處理是因為 null 沒有引用任何對象篱瞎,當(dāng)然也不會引用 C 類型的對象。

實際上痒芝,通過強制類型轉(zhuǎn)換來轉(zhuǎn)換對象的類型通常并不是一種好的做法俐筋。在我們的示例中,大多數(shù)情況并不需要將 Employee 對象強制轉(zhuǎn)換成 Manager 對象严衬,兩個類的對象都能夠正確地調(diào)用 getSalary 方法澄者,這是因為實現(xiàn)多態(tài)性的動態(tài)綁定機制能夠自動地找到正確的方法。

只有在使用 Manager 中特有的方法時才需要進行類型轉(zhuǎn)換请琳。如果出于某種原因發(fā)現(xiàn)需要在 Employee 對象上調(diào)用 Manager 中特有的 setBonus 方法粱挡,那么就應(yīng)該自問超類的設(shè)計是否合理〉テ穑可能需要重新設(shè)計超類抱怔,并添加 setBonus 方法,這才是更合適的選擇嘀倒。請記住屈留,只要沒有捕獲 ClassCastException 異常局冰,程序就會終止執(zhí)行。 一般情況下灌危,最好盡量少用強制類型轉(zhuǎn)換和 instanceof 運算符康二。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勇蝙,隨后出現(xiàn)的幾起案子沫勿,更是在濱河造成了極大的恐慌,老刑警劉巖味混,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件产雹,死亡現(xiàn)場離奇詭異,居然都是意外死亡翁锡,警方通過查閱死者的電腦和手機蔓挖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馆衔,“玉大人瘟判,你說我怎么就攤上這事〗抢#” “怎么了拷获?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長减细。 經(jīng)常有香客問我匆瓜,道長,這世上最難降的妖魔是什么未蝌? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任陕壹,我火速辦了婚禮,結(jié)果婚禮上树埠,老公的妹妹穿的比我還像新娘。我一直安慰自己嘶伟,他們只是感情好怎憋,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著九昧,像睡著了一般绊袋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铸鹰,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天癌别,我揣著相機與錄音,去河邊找鬼蹋笼。 笑死展姐,一個胖子當(dāng)著我的面吹牛躁垛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圾笨,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼教馆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了擂达?” 一聲冷哼從身側(cè)響起土铺,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎板鬓,沒想到半個月后悲敷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡俭令,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年后德,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唤蔗。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡探遵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妓柜,到底是詐尸還是另有隱情箱季,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布棍掐,位于F島的核電站藏雏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏作煌。R本人自食惡果不足惜掘殴,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粟誓。 院中可真熱鬧奏寨,春花似錦、人聲如沸鹰服。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悲酷。三九已至套菜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間设易,已是汗流浹背逗柴。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顿肺,地道東北人戏溺。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓渣蜗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親于购。 傳聞我的和親對象是個殘疾皇子袍睡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容