繼承(Extends)

/**特性
 * 同類型之間可以繼承,類與類,接口與接口
 * 繼承只能是單一的 
 * 只有private修飾的屬性和方法不可被繼承下來(包括最終的靜態的屬性,靜態的同步的方法)
 * 子類的創建會調用父類的靜態塊,非靜態塊和構造器。
 * 子類中的構造器會隱式添加super()調用父類無參構造器
 *
/**繼承的作用?
 * 代碼重用
 *
/**強轉
 * 引用是子類和引用是子類之間的強轉,是編譯異常,如果沒有繼承關係,任何兩個類之間的強轉,都將是編譯異常,因爲
 * 任何一個類的父類都是Object。
 * 父類強轉成子類,是運行時異常,ClassCastException
 * 繼承中的轉換,只能是子類自動轉爲父類。沒有強轉,如果採用強轉的語法去把子類轉爲父類,對象依然是子類。
 * 可以理解爲無法進行強轉,但編譯器也不會報錯。
 *
/**父子類中的靜態屬性,非靜態屬性,靜態塊,非靜態塊,構造器的執行順序。
 * 父類靜態塊和靜態屬性-->子類靜態塊和靜態屬性-->父類非靜態塊塊和非靜態屬性-->
 * 子類非靜態塊和非靜態屬性-->父類構造器-->子類構造器
 *
/**子類創建前的操作--調用父類構造器super(有參數或者沒參數)
 * 子類中的構造器,無論有沒有編寫super(),默認都有super()這句命令。
 * 該命令爲調用父類默認構造器,調用構造器和調用靜態方法一樣會加載類,從而引發靜態塊和非靜態塊的執行。
 * 但並不意味着子類的創建會帶動父類的創建。但也並不說明沒有創建父類。
 * 如果父類定義了有參的構造器並且子類沒有調用父類有參構造器,那麼父類必須包含一個無參的構造器
 * 因爲在創建子類時,調用了構造器,而構造器默認有super()命令調用父類的無參構造。
 * 在父類有參的前提下,調用無參出現編譯異常。所以在子類中必須要有調用父類有參構造器的語句:super(parameters);
 * 如果沒有的話父類就必須有無參的構造器。
 *
/**用父類引用去接受子類對象,調用子類的某個方法(該方法覆蓋了父類的方法),執行的是父類的方法還是子類的方法?
 * 子類,引用決定可調用的方法列表,方法的位置來源於創建的子類對象。也就是說如果子類中擁有父類沒有的方法,
 * 並且用父類引用去接受子類對象的時候,那麼無法調用子類的該方法。如果強硬編寫調用該方法,會出現undefined。
 * 如果調用了父類和子類都有的方法,那麼會執行子類的方法,如果子類中沒有,那麼會執行父類的方法。
 *
/** 父類有一方法訪問修飾符爲protected,子類同名方法同參數,訪問修飾符可否更改?(重寫/覆蓋)
 * 以,但是訪問修飾符的範圍一定要比父類的訪問修飾符小或者相等。如果方法拋出了異常,要麼不拋異常,
 * 要麼異常也必須是父類所拋出異常或者其子類。重寫有三不改,返回類型不能改,參數類型不能改,參數個數不能改。
 * 也就是方法原型(訪問修飾符,返回類型,參數,拋出的異常)要統一或兼容。
 *
/**父類私有的屬性如何被繼承下來?
/**子類若編寫了和父類同樣的屬性,並且繼承了父類的get方法,當子類對象執行了get方法後,返回的是子類的屬性還是父類的?
 * 1,通過繼承get方法繼承下來。
 * 2,父類的,子類雖然繼承了父類的get,但是子類並沒有覆蓋父類的get方法,所以get方法是父類所有的,
 * 執行的便是父類的get方法,所以獲取的是父類的屬性。
 * extends是擴展,並不是真的去繼承,super還是super的,sub還是sub的。sub可以引用super的非private的屬性和方法
 * 並不意味着super的屬性和方法就屬於sub。extends只是一個擴展,擴展super類中沒有的東西或者沒有實現的東西或者去覆蓋
 * super類的方法來滿足新的業務需求。 
 *
 * @author silone
 *
 */





發佈了35 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章