1. 程式人生 > >繼 承(面向對象特征之一)

繼 承(面向對象特征之一)

實現 pub 過程 bsp 運行時 完成 打破 常量 strong

1:成員變量。

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

如果想要調用父類中的屬性值,需要使用一個關鍵字:super

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

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

註意:子父類中通常是不會出現同名成員變量的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。

2:成員函數。

當子父類中出現了一模一樣的方法時,建立子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉一樣。所以這種情況,是函數的另一個特性:重寫

3:構造函數。

發現子類構造函數運行時,先運行了父類的構造函數。為什麽呢?

原因:子類的所有構造函數中的第一行,其實都有一條隱身的語句super();

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

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

因為子類繼承父類,會繼承到父類中的數據,所以必須要看父類是如何對自己的數據進行初始化的。所以子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程

註意:子類中所有的構造函數都會默認訪問父類中的空參數的構造函數,因為每一個子類構造內第一行都有默認的語句super();

如果父類中沒有空參數的構造函數,那麽子類的構造函數內,必須通過super語句指定要訪問的父類中的構造函數。

如果子類構造函數中用this來指定調用子類自己的構造函數,那麽被調用的構造函數也一樣會訪問父類中的構造函數。

問題:

super()和this()是否可以同時出現的構造函數中?

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

super()或者this():為什麽一定要定義在第一行?

因為super()或者this()都是調用構造函數,構造函數用於初始化,所以初始化的動作要先完成。

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

1:子類覆蓋父類時,必須要保證,子類方法的權限必須大於等於父類方法權限可以實現繼承。否則,編譯失敗。(舉個例子,在父類中是public的方法,如果子類中將其降低訪問權限為private,那麽子類中重寫以後的方法對於外部對象就不可訪問了,這個就破壞了繼承的含義)

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

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

這時如何解決問題呢?介紹一個關鍵字,final

final特點:(詳細解釋見前面)

1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。

2:被final修飾的類是一個最終類,不可以被繼承。

3:被final修飾的方法是一個最終方法,不可以被覆蓋。

4:被final修飾的變量是一個常量,只能賦值一次。

繼 承(面向對象特征之一)