06 Java 的繼承

繼承

Java 繼承的實現(xiàn)(只支持類的單繼承盼樟,不支持類多繼承,但是支持接口的多實現(xiàn))。
多個類中存在相同屬性和行為時殖氏,將這些內(nèi)容抽取到單獨一個類. 定義類時直接通過 extends 關(guān)鍵字指明要繼承的父類。
子類對象除了可以訪問子類中直接定義的成員外姻采,可直接訪問父類的所有非私有成員雅采。

繼承的作用

  • 繼承提高了代碼的復(fù)用性。
  • 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關(guān)系慨亲,提供了多態(tài)的前提婚瓜。
  • 不要僅為了獲取其他類中某個功能而去強行使用繼承,類與類之間要有所屬( " is a " )關(guān)系)刑棵。

如何使用一個繼承體系中的功能

  • 查閱父類功能(定義了共性的功能)
  • 創(chuàng)建子類對象使用功能(因為父類可能不能創(chuàng)建對象, 而且子類提供了更豐富的功能)
  • 繼承中自子類變量的特點:如果子類出現(xiàn)非私有的同名變量時, 子類訪問本類變量用 this, 子類訪問父類中的同名變量用 super巴刻。

成員變量的隱藏

子類成員變量與父類一樣,會屏蔽父類中的成員變量蛉签,稱為“成員變量隱藏”胡陪。

方法的覆蓋(Override)

如果子類方法完全與父類方法相同,即:相同的方法名碍舍、相同的參數(shù)列表和相同的返回值督弓,只是方法體不同,這稱為子類覆蓋(Override)父類方法乒验。

在聲明方法時最后添加@Override注解愚隧,@Override注解不是方法覆蓋必須的,但添加 @Override 注解有兩個好處:

  • 提高程序的可讀性锻全。
  • 編譯器檢查 @Override 注解的方法在父類中已定義的方法是否匹配狂塘,如果不匹配則會報錯。

方法覆蓋時應(yīng)遵循的原則

  1. 覆蓋后的方法不能比原方法有更嚴(yán)格的訪問控制(可以相同)鳄厌。例如將代碼訪問控制 public 修改 private荞胡,那么會發(fā)生編譯錯誤。
  2. 覆蓋后的方法不能比原方法產(chǎn)生更多的異常了嚎。
  3. 父類中的私有方法不可以被覆蓋泪漂。
  4. 子類的返回類型可以是父類的子類廊营。

覆蓋的應(yīng)用

  • 當(dāng)子類需要父類的功能,而功能主體子類有自己特有內(nèi)容時萝勤,可以復(fù)寫父類中的方法露筒,這樣也沿襲了父類的功能
  • 構(gòu)造方法在類繼承中的作用
    構(gòu)造方法不能繼承.由于子類對象要對來自父類的成員進行初始化,因此,在創(chuàng)建子類對象時除了執(zhí)行子類的構(gòu)造方法外,還需要調(diào)用父類的構(gòu)造方法.具體遵循如下原則:
    1. 當(dāng)子類未定義構(gòu)造方法時,創(chuàng)建對象時將無條件地調(diào)用父類的空構(gòu)造方法,會默認(rèn)在第一條添加super();
    2. 對于父類的含參數(shù)構(gòu)造方法,子類可以在自己構(gòu)造方法中使用關(guān)鍵字 super 來調(diào)用它, 但 super 調(diào)用語句必須是子類構(gòu)造方法中的第一個可執(zhí)行語句敌卓;
    3. 子類在自己定義構(gòu)造方法中如果沒有用 super 明確調(diào)用父類的構(gòu)造方法慎式,則在創(chuàng)建對象時,將自動先執(zhí)行父類的無參構(gòu)造方法,然后再執(zhí)行自己定義的構(gòu)造方法。
      所以在一個類的設(shè)計時如果有構(gòu)造方法趟径,最好提供一個無參構(gòu)造方法瘪吏。例如系統(tǒng)類庫中的類大多提供了無參構(gòu)造方法,用戶編程時最好也要養(yǎng)成此習(xí)慣蜗巧。

【注意】使用 this 查找匹配的方法時首先在本類查找掌眠,找不到時再到其父類和祖先類查找;使用 super 查找匹配方法時幕屹,首先到直接父類查找蓝丙,如果不存在,則繼續(xù)到其祖先類逐級往高層查找香嗓。

繼承的更多細(xì)節(jié)

? 構(gòu)造方法迅腔;
在父類構(gòu)造方法中調(diào)用可被子類重寫的方法装畅,是一種不好的實踐靠娱,容易引起混淆,應(yīng)該只調(diào)用private的方法掠兄。

? 重名與靜態(tài)綁定像云;

靜態(tài)綁定在程序編譯階段即可決定。實例變量蚂夕、靜態(tài)變量迅诬、靜態(tài)方法、private 方法婿牍,都是靜態(tài)綁定的侈贷。
而動態(tài)綁定則要等到程序運行時。子類可以重寫父類非private的方法等脂,當(dāng)調(diào)用的時候俏蛮,會動態(tài)綁定,執(zhí)行子類的方法上遥。

? 重載和重寫搏屑;

重載是指方法名稱相同但參數(shù)簽名不同(參數(shù)個數(shù)、類型或順序不同)粉楚,重寫是指子類重寫與父類相同參數(shù)簽名的方法辣恋。

對一個函數(shù)調(diào)用而言亮垫,可能有多個匹配的方法,有時候選擇哪一個并不是那么明顯伟骨。當(dāng)有多個重名函數(shù)的時候饮潦,在決定要調(diào)用哪個函數(shù)的過程中,首先是按照參數(shù)類型進行匹配的底靠,換句話說害晦,尋找在所有重載版本中最匹配的,然后才看變量的動態(tài)類型暑中,進行動態(tài)綁定壹瘟。

? 父子類型轉(zhuǎn)換;

類型轉(zhuǎn)換有兩個方向:

  • 將父類引用類型變量轉(zhuǎn)換為子類類型鳄逾,這種轉(zhuǎn)換稱為向下轉(zhuǎn)型(downcast)稻轨;
  • 將子類引用類型變量轉(zhuǎn)換為父類類型,這種轉(zhuǎn)換稱為向上轉(zhuǎn)型(upcast)雕凹。向下轉(zhuǎn)型需要強制轉(zhuǎn)換殴俱,而向上轉(zhuǎn)型是自動的

將父類引用賦值給子類變量時要進行強制轉(zhuǎn)換枚抵,強制轉(zhuǎn)換在編譯時總是認(rèn)可的线欲,但運行時的情況取決于對象的值.如果父類對象引用指向的就是該子類的一個對象,則轉(zhuǎn)換是成功的。否則會拋出ClassCastException汽摹。如果不能確定實例是哪一種類型李丰,可以在轉(zhuǎn)型之前使用 instanceof 運算符進行判斷。

因此并不是所有的引用類型都能互相轉(zhuǎn)換逼泣,只有屬于同一棵繼承層次樹中的引用類型才可以轉(zhuǎn)換趴泌。

? 可見性重寫;

重寫方法時拉庶,一般并不會修改方法的可見性嗜憔。但我們還是要說明一點,重寫時氏仗,子類方法不能降低父類方法的可見性吉捶。
為什么要這樣規(guī)定呢?繼承反映的是“is-a”的關(guān)系皆尔,即子類對象也屬于父類呐舔,子類必須支持父類所有對外的行為,將可見性降低就會減少子類對外的行為床佳,從而破壞“is-a”的關(guān)系滋早,但子類可以增加父類的行為,所以提升可見性是沒有問題的砌们。

舉例:

// 父類
Object lalala(Integer x) throws IllegalArgumentException {

// 子類
@Override
Integer lalala(Integer x);

子類只能拋出范圍內(nèi)或者更小的異常杆麸,返回類型也只能更小搁进,但是方法的可見性可以更大。雖然重寫方法時昔头,一般并不會修改方法的簽名饼问。

? 防止繼承(final)

final關(guān)鍵字可以修飾變量,也可修飾final 使成為最終類揭斧。

繼承是把雙刃劍

繼承破壞封裝什么是封裝呢莱革?封裝就是隱藏實現(xiàn)細(xì)節(jié),提供簡化接口讹开。使用者只需要關(guān)注怎么用盅视,而不需要關(guān)注內(nèi)部是怎么實現(xiàn)的。實現(xiàn)細(xì)節(jié)可以隨時修改旦万,而不影響使用者闹击。

繼承可能破壞封裝是因為子類和父類之間可能存在著實現(xiàn)細(xì)節(jié)的依賴。子類在繼承父類的時候成艘,往往不得不關(guān)注父類的實現(xiàn)細(xì)節(jié)赏半,而父類在修改其內(nèi)部實現(xiàn)的時候,如果不考慮子類淆两,也往往會影響到子類断箫。

繼承既強大又有破壞性,那怎么辦呢秋冰?1)避免使用繼承仲义;2)正確使用繼承。

怎么避免繼承的有三種方法:
? 使用final關(guān)鍵字丹莲;
? 優(yōu)先使用組合而非繼承光坝;
? 使用接口尸诽。

使用組合甥材,子類就不需要關(guān)注基類是如何實現(xiàn)的了,基類修改實現(xiàn)細(xì)節(jié)性含,增加公開方法洲赵,也不會影響到子類了。

多態(tài)性

父類或者接口的引用指向或者接收自己的子類對象叫多態(tài) 商蕴。實際執(zhí)行調(diào)用的是子類實現(xiàn)叠萍,這叫動態(tài)綁定。
作用:多態(tài)的存在提高了程序的擴展性和后期可維護性.

發(fā)生多態(tài)要有三個前提條件:

  1. 繼承绪商。多態(tài)發(fā)生一定要子類和父類之間苛谷。
  2. 覆蓋。子類覆蓋了父類的方法格郁。
  3. 聲明的變量類型是父類類型腹殿,但實例則指向子類實例独悴。

UML圖簡介

UML是 Unified Modeling Language 的縮寫,即統(tǒng)一標(biāo)準(zhǔn)建模語言锣尉。它集成了各種優(yōu)秀的建模方法學(xué)發(fā)展而來的刻炒。UML 圖常用的有例圖、協(xié)作圖自沧、活動圖坟奥、序列圖、部署圖拇厢、構(gòu)件圖爱谁、類圖、狀態(tài)圖孝偎。

面向?qū)ο蠓治雠c設(shè)計(OOAD)時管行,會用到 UML 圖,其中類圖非常重要邪媳,用來描述系統(tǒng)靜態(tài)結(jié)構(gòu)捐顷。Student 繼承 Person的類圖如圖所示。類圖中的各個元素說明如圖所示雨效,類用矩形表示迅涮,一般分為上、中徽龟、下三個部分叮姑,上部分是類名,中部分是成員變量据悔,下部分是成員方法传透。實線+空心箭頭表示繼承關(guān)系,箭頭指向父類极颓,箭頭末端是子類朱盐。UML 類圖中還有很多關(guān)系,如圖所示菠隆,如圖虛線+空心箭頭表示實線關(guān)系兵琳,箭頭指向接口,箭頭末端是實線類骇径。

類圖中的元素

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躯肌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子破衔,更是在濱河造成了極大的恐慌清女,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晰筛,死亡現(xiàn)場離奇詭異嫡丙,居然都是意外死亡忠售,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門迄沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稻扬,“玉大人,你說我怎么就攤上這事羊瘩√┘眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵尘吗,是天一觀的道長逝她。 經(jīng)常有香客問我,道長睬捶,這世上最難降的妖魔是什么黔宛? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮擒贸,結(jié)果婚禮上臀晃,老公的妹妹穿的比我還像新娘。我一直安慰自己介劫,他們只是感情好徽惋,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著座韵,像睡著了一般险绘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上誉碴,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天宦棺,我揣著相機與錄音,去河邊找鬼黔帕。 笑死代咸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬屹。 我是一名探鬼主播侣背,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白华,長吁一口氣:“原來是場噩夢啊……” “哼慨默!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弧腥,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤厦取,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后管搪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾攻,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡铡买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霎箍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奇钞。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖漂坏,靈堂內(nèi)的尸體忽然破棺而出景埃,到底是詐尸還是另有隱情,我是刑警寧澤顶别,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布谷徙,位于F島的核電站,受9級特大地震影響驯绎,放射性物質(zhì)發(fā)生泄漏完慧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一剩失、第九天 我趴在偏房一處隱蔽的房頂上張望屈尼。 院中可真熱鬧,春花似錦拴孤、人聲如沸鸿染。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涨椒。三九已至,卻和暖如春绽媒,著一層夾襖步出監(jiān)牢的瞬間蚕冬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工是辕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留囤热,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓获三,卻偏偏與公主長得像旁蔼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疙教,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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