繼 承

繼 承java

好處:函數

1:提升了代碼的複用性。this

2:讓類與類之間產生了關係,提供了另外一個特徵多態的前提。spa

 

父類的由來:實際上是由多個類不斷向上抽取共性內容而來的。對象

java中對於繼承,java只支持單繼承。java雖然不直接支持多繼承,可是保留了這種多繼承機制,進行改良。繼承

 

單繼承:一個類只能有一個父類。內存

多繼承:一個類能夠有多個父類。編譯

 

爲何不支持多繼承呢?變量

由於當一個類同時繼承兩個父類時,兩個父類中有相同的功能,那麼子類對象調用該功能時,運行哪個呢?由於父類中的方法中存在方法體。權限

可是java支持多重繼承。A繼承B  B繼承C  C繼承D。

多重繼承的出現,就有了繼承體系。體系中的頂層父類是經過不斷向上抽取而來的。它裏面定義的該體系最基本最共性內容的功能。

因此,一個體系要想被使用,直接查閱該系統中的父類的功能便可知道該體系的基本用法。那麼想要使用一個體系時,須要創建對象。建議創建最子類對象,由於最子類不只可使用父類中的功能。還可使用子類特有的一些功能。

 

簡單說:對於一個繼承體系的使用,查閱頂層父類中的內容,建立最底層子類的對象。 

子父類出現後,類中的成員都有了哪些特色:

1:成員變量。

     當子父類中出現同樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。

     若是想要調用父類中的屬性值,須要使用一個關鍵字:super

     This表明是本類類型的對象引用。

     Super表明是子類所屬的父類中的內存空間引用。

     注意:子父類中一般是不會出現同名成員變量的,由於父類中只要定義了,子類就不用在定義了,直接繼承過來用就能夠了。

2:成員函數。

當子父類中出現瞭如出一轍的方法時,創建子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉同樣。因此這種狀況,是函數的另外一個特性:覆蓋(複寫,重寫)

何時使用覆蓋呢?當一個類的功能內容須要修改時,能夠經過覆蓋來實現。

3:構造函數。

發現子類構造函數運行時,先運行了父類的構造函數。爲何呢?

緣由:子類的全部構造函數中的第一行,其實都有一條隱身的語句super();

super(): 表示父類的構造函數,並會調用於參數相對應的父類中的構造函數。而super():是在調用父類中空參數的構造函數。

爲何子類對象初始化時,都須要調用父類中的函數?(爲何要在子類構造函數的第一行加入這個super()?)

由於子類繼承父類,會繼承到父類中的數據,因此必需要看父類是如何對本身的數據進行初始化的。因此子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程

 

注意:子類中全部的構造函數都會默認訪問父類中的空參數的構造函數,由於每個子類構造內第一行都有默認的語句super();

若是父類中沒有空參數的構造函數,那麼子類的構造函數內,必須經過super語句指定要訪問的父類中的構造函數。

若是子類構造函數中用this來指定調用子類本身的構造函數,那麼被調用的構造函數也同樣會訪問父類中的構造函數。

 

問題:super()和this()是否能夠同時出現的構造函數中。

兩個語句只能有一個定義在第一行,因此只能出現其中一個。

 

super()或者this():爲何必定要定義在第一行?

由於super()或者this()都是調用構造函數,構造函數用於初始化,因此初始化的動做要先完成。

 

繼承的細節:

何時使用繼承呢?

當類與類之間存在着所屬關係時,才具有了繼承的前提。a是b中的一種。a繼承b。狼是犬科中的一種。

英文書中,所屬關係:" is a "

注意:不要僅僅爲了獲取其餘類中的已有成員進行繼承。

 

因此判斷所屬關係,能夠簡單看,若是繼承後,被繼承的類中的功能,均可以被該子類所具有,那麼繼承成立。若是不是,不能夠繼承。

 

細節二:

在方法覆蓋時,注意兩點:

1:子類覆蓋父類時,必需要保證,子類方法的權限必須大於等於父類方法權限能夠實現繼承。不然,編譯失敗。

2:覆蓋時,要麼都靜態,要麼都不靜態。 (靜態只能覆蓋靜態,或者被靜態覆蓋)

 

繼承的一個弊端:打破了封裝性。對於一些類,或者類中功能,是須要被繼承,或者複寫的。

相關文章
相關標籤/搜索