繼承

面嚮對象語言三個特性,封裝繼承多態。說完封裝說繼承。

達爾文的物種起源中提到,要用發展的眼光看問題,繼承就是爲了反映這個的。子類會繼承父類中除了private,construtor,static類型以外的所有內容。

子類在使用這些方法的時候跟使用自己的沒有不同,只是上一篇文章說的那樣,繼承來的成員的命名空間還是與父類相同的。

繼承的一些語法規則:

  • 使用extends關鍵字。
  • 如果父類中有非默認的構造函數,需要在子類的構造函數中使用super(param)進行顯示的調用。
  • final類是不能夠被繼承的。

產生了繼承之後,如果子類跟父類有同名的方法會產生什麼現象呢?這時就會有三個概念:重載(overloading),覆蓋(override),隱藏。

實際上吧,這三個概念其實挺不容易混淆的。

重載

方法名相同,但是形參列表不同。包括了順序的不同和父子類的不同。

父類中繼承來的方法跟本身的方法一樣,是能夠進行重載的。

覆蓋和隱藏。

非static方法,方法名相同,參數列表也相同的就是覆蓋。覆蓋的方法可見性不能縮小,拋出的異常不能擴大。另外final的方法是不能夠覆蓋的。

而statci方法,方法名相同,參數列表也相同的就是隱藏,實際上static方法是不能夠被繼承的,跟覆蓋沒什麼相同的地方,用代碼來解釋一下就是這樣的:

打印的結果爲:
pub_sub
pub_static_base

可見,同樣是父類的引用,子類的實例,調用的方法卻不同,有覆蓋現象的調用的是子類的方法。

 

剛纔說了final的類不能夠繼承,final的方法不能夠覆蓋,可見final強調了一個不能改變的意思,下面我們就來詳細的討論一下final。

final數據

  • 常量。就是不能改變的量,如果再加上static的話就是隻佔一塊固定內存的常量了。可以在聲明的時候指定初始值,這是編譯時的常量。也可以聲明是不指定初始值,但是在構造器中必須指定,否則會有編譯錯誤,這個是運行時常量。
  • 引用。用於引用類型的時候,表示這個引用不能指向別的引用。
  • 參數。表示在方法中,參數不能夠重新定義。可以用來強制按照編程規範來開發。

final方法

  • 使用final方法的時候通常是出於兩個目的,效率或者是設計,
  • 設計上的目的是禁止派生類進行修改。當我們想讓一個方法被繼承,但是不能被覆蓋的時候就用這個。
  • 在效率上,據說會採用內聯的方式,會把方法拷貝過來進行進行編譯,但是實際效果微乎其微,因此通常都是設計上的考

final類

表示不能繼承的類,我們要慎用,因爲我們不知道什麼時候它會有用。

 

上傳

這個是一個概念,繼承賦予了能夠把子類對象,當成自己本身類型或者是父類型來進行處理的功能,這樣我們的同一份代碼就能運行在這些不同的類別之上。。
這種能力叫做上傳。
使用的時候就是形參爲基類的,可以傳入其派生類的實例來調用方法。因爲把子類對象作爲基類來處理,而在uml圖中基類在上面因此命名爲上傳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章