一.為什么要繼承呢?
可以保持原有類的功能上擴展新功能,繼承主要解決的問題是共性的抽取,實現代碼的復用
二.繼承的語法
舉例:
相關圖像:

三.父類成員訪問
1.子類中(注意)訪問父類的成員變量
了解原因:繼承下來父類成員可能與子類成員同名時(主要原因),在子類成員方法中訪問該類成員時該訪問哪一個?或者利用子類對象引用同名成員時該訪問哪一個?
在子類方法中(在父類方法不一樣)或子類對象訪問成員時:
如果訪問的成員變量子類中有,優先訪問自己的成員變量。
如果訪問的成員變量子類中無,則訪問父類繼承下來的,如果父類也沒有定義。
如果訪問的成員變量與父類中成員變量同名,則優先訪問自己的。
成員變量訪問遵循就近原則,自己有優先自己的,如果沒有則向父類中找。
舉例和相關圖像:
2.子類中訪問父類的成員方法
在子類方法中或子類對象訪問成員方法時:
通過子類對象訪問父類與子類中不同名方法時,優先在子類中找,找到則訪問,否則在父類中找,找到則訪問,否則編譯報錯。
通過派生類對象訪問父類與子類同名方法時,如果父類和子類同名方法的參數列表不同(重載),根據調用方法適傳遞的參數選擇合適的方法訪問,如果沒有則報錯;如果父類和子類同名方法的參數列表相同(重寫以后會講),成員方法訪問遵循就近原則,自己有優先自己的,如果沒有則向父類中找。
舉例和相關圖像:
問題:如果出現在繼承時出現同名成員變量或方法時,我們該在子類中如何訪問與父類的成員變量和方法同名的成員變量和方法呢?
?四.super關鍵字
作用:在子類中訪問父類的成員變量和方法
五.子類構造方法
1.若父類顯式定義無參或者默認的構造方法,在子類構造方法第一行默認有隱含的super()調用,即調用基類構造方法
2.如果父類構造方法是帶有參數的,此時需要用戶為子類顯式定義構造方法,并在子類構造方法中選擇合適的父類構造方法調用,否則編譯失敗。
3.在子類構造方法中,super(..)調用父類構造時,必須是子類構造函數中第一條語句。
4.super(..)只能在子類構造方法中出現一次,并且不能和this同時出現(講this和super區別會講)
六.this和super的區別
相同點:
1.都是lava中的關鍵字
2.只能在類的非靜態方法中使用,用來訪問非靜態成員方法和字段
3.在構造方法中調用時,必須是構造方法中的第一條語句,并且不能同時存在
不同點:
1.this是當前對象的引用,當前對象即調用實例方法的對象,super相當于是子類對象中從父類繼承下來部分成員的引用
2.在非靜態成員方法中,this用來訪問本類的方法和屬性,super用來訪問父類繼承下來的方法和屬性
3.在構造方法中:this(..)用于調用本類構造方法,super(..)用于調用父類構造方法,倆者都必須是構造方法的第一條語句,所以兩種調用不能同時在構造方法中出現
4.構造方法中一定會存在super(..)的調用,用戶沒有寫編譯器也會增加,但是this(..)用戶不寫則沒有
七.再談初始化
之前在談初始化時執行順序時沒有繼承,那繼承時執行順序會是什么樣呢?
由上述代碼加上之前學習的對執行順序進行總結:
步驟 | 類別 | 執行類容 |
1 | 父類靜態 | 父類static修飾的成員變量初始化----》父類靜態代碼塊 |
2 | 子類靜態 | 子類static修飾的成員變量初始化----》子類靜態代碼塊 |
3 | 父類實例 | 父類實例變量初始化---》父類實例代碼塊---》父類構造方法 |
4 | 子類實例 | 子類實例變量初始化---》子類實例代碼塊---》子類構造方法 |
八.protected(類和對象補充訪問限定符)
代碼舉例:
九.繼承方式
1.單繼承
2.多層繼承(最好別超過3層)
3.不同類繼承一個類
4.多繼承(不支持)
十.final關鍵字
1.修飾變量或字段(類中成員變量):表示常量(既不能修改)
2.修飾類:表示該類不能被繼承,叫做密封類
3.修飾方法:表示該方法不能被重寫(以后講)
十一.繼承和組合
繼承表示對象之間是is-a的關系,比如:狗是動物,貓是動物
組合表示對象之間是has-a的關系,比如:汽車和其輪胎、發動機、方向盤、車載系統等的關系就應該是組合,因為汽車是有這些部件組成的