=============================================================================
涉及到的知識點有:
1:繼承(掌握)
(0)Java繼承概述
(1)繼承定義
(2)Java中如何表示繼承呢?格式是什麼呢?
(3)繼承的好處
(4)繼承的弊端
A:讓類的耦合性增強。這樣某個類的改變,就會影響其他和該類相關的類。
B:打破了封裝性。
(5)Java中繼承的特點
(6)繼承的注意事項
A:Java中類隻支援單繼承,不支援多繼承。
B:Java中可以多層(重)繼承(繼承體系)
(7)那麼什麼時候使用繼承呢?
A:繼承展現的是:is a的關系。
B:采用假設法。
(8)Java繼承中的成員關系
A:成員變量
B:構造方法
C:成員方法
(9)方法重寫:(方法=成員方法)
(10)方法重寫的兩個面試題
A:Override和Overload的差別?Overload是否可以改變傳回值類型?
B:this和super的差別和各自的作用?
(11)資料初始化的面試題
A:一個類的初始化過程
B:子父類的構造執行過程
C:子父類的初始化(分層初始化)
(12)繼承案例
A:學生和老師案例
B:貓狗案例的分析和實作
(1)繼承定義:把多個類中相同的成員給提取出來定義到一個獨立的類中。然後讓這多個類和該獨立的類産生一個關系,這多個類就具備了這些内容。這個關系叫繼承。
A:用關鍵字extends表示。
B:格式:
class 子類名 extends 父類名 {}
---------------------------------------
(3)繼承的好處:
A:提高了代碼的複用性。
B:提高了代碼的維護性。
C:讓類與類之間産生了一個關系,是多态的前提。
類與類産生了關系,其實也是繼承的一個弊端:
類的耦合性增強了。
(4)繼承的弊端:
開發設計的原則:低耦合,高内聚。
耦合:類與類之間的關系。
内聚:自己完成某件事情的能力。
因為我們曾經說過:一個類中的成員盡量不要讓外界直接通路,子類繼承父類後,那麼父類的封裝就被打破了。
(5)Java中繼承的特點:
即:一個類隻能有一個父類,不可以有多個父類。
class Father {}
class Mother {}
class Son exnteds Father {} //正确的
class Son extends Father,Mother {} //錯誤的
有些語言是支援多繼承的額,比如c++。其格式是:extends 類1,類2,...
class A {}
class B extends A {}
class C extends B {}
(6)繼承的注意事項:
A:子類不能繼承父類的私有成員(成員變量和成員方法)。
其實這也展現了繼承的另一個弊端:打破了封裝性。
B:子類不能繼承父類的構造方法,但是可以通過super關鍵字去通路父類構造方法。
因為構造方法比較特殊,談不上繼承,構造方法是對對象進行資料初始化的。
C:不要為了部分功能而去繼承。
例如:
class A {
public void show1(){}
public void show2(){}
}
class B {
public void show3(){}
//我們發現B類中出現了和A類一樣的show2()方法,是以,我們就用繼承來展現。
class B extends A {
這樣其實不好,因為這樣你不但有了show2(),而且還多了show1()。
有可能show1()不是你想要的。
Person
Student
Teacher
水果
蘋果
香蕉
橘子
假設有兩個類A,B。隻有他們符合A是B的一種,或者B是A的一種的時候,就可以考慮使用繼承。
(8)Java繼承中的成員關系:
a:子類的成員變量名稱和父類中的成員變量名稱不一樣時,這個太簡單。
b:子類的成員變量名稱和父類中的成員變量名稱一樣時,這個怎麼通路呢?
在子類的方法中通路一個成員變量的查找順序:
1.在子類方法的局部範圍找,有就使用。
2.在子類的成員範圍找,有就使用。
3.在父類的成員範圍找,有就使用。
4.都找不到,就報錯。
a:子類的所有的構造方法預設都會去通路父類的無參構造方法。
因為子類會繼承父類中的資料,可能還會使用父類的資料。
是以,子類初始化之前,一定要先完成父類資料的初始化。
特别注意:其實子類的每一個構造方法的第一條語句預設都是:super();
b:父類中如果沒有無參構造方法(也即父類中隻給了帶參構造方法),子類的構造方法怎麼辦?
法1:子類的構造方法通過 super(...); 去顯示調用父類的帶參構造方法。
法2:子類的構造方法通過 this();/this(...); 調用本類的其他的構造方法,但是子類的其他的構造方法中一定會有一個去通路了父類的帶參構造方法。
法3:讓父類提供無參構造。
注意事項: this();/this(...);/super(...); 這三個語句通路子類或父類的構造方法的時候,必須放在第一句語句上。
否則,就可能會對父類資料進行多次初始化。
a:子類的成員方法名稱和父類中的成員方法名稱不一樣時,這個太簡單。
b:子類的成員方法名稱和父類中的成員方法名稱一樣時,這個怎麼通路呢?
通過子類對象通路一個成員方法的查找順序:
1.在子類的成員方法中找,有就使用。
2.在父類的成員方法中找,有就使用。
3.都找不到,就報錯。
方法重寫:子類中出現了和父類中方法聲明一模一樣的方法(方法名、參數清單和傳回值類型都一樣),也被稱為方法覆寫、方法複寫。
方法重載:本類中出現的方法名一樣,參數清單不同,與傳回值類型無關的方法。
方法重寫的使用特點:
如果子類和父類的方法名不同,就調用各自對應的方法。
如果子類和父類的方法名相同,最終使用的是子類自己的方法。
方法重寫的應用:
當子類需要父類的功能,而功能的主體子類還有自己特有的内容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類自己特有的内容。
方法重寫的注意事項:
1.父類中的私有方法不能被重寫。
因為父類私有方法子類根本無法繼承。
2.子類重寫父類方法時,通路權限不能更低。(最好權限要一緻。)
預設的權限要小于public的權限。
3.父類的靜态方法,子類也必須通過靜态方法進行重寫。
(其實這個算不上方法重寫,但是現象确實如此,至于為什麼算不上方法重寫,多态中我會講解。)
因為方法是跟對象相關的,而靜态是跟類相關的。
小結:子類重寫父類方法的時候,最好聲明一模一樣。
(10)方法重寫的兩個面試題:
方法重寫:
在子類中,出現和父類中一模一樣的方法聲明的現象。(包含方法名、參數清單和傳回值類型都一樣)
方法重載:
同一個類中,出現的方法名相同,參數清單不同,與傳回值類型無關的現象。
方法重載能改變傳回值類型,因為它和傳回值類型無關。
Override:方法重寫
Overload:方法重載
this: 代表目前類的對象引用。
super:代表父類存儲空間的辨別。(可以了解為父類的引用,通過這個東西可以通路父類的成員。)
應用場景:
成員變量:
this.成員變量
super.成員變量
構造方法:
this(...)
super(...)
成員方法:
this.成員方法
super.成員方法
先進行成員變量的初始化:
預設初始化
顯示初始化
構造方法初始化
B:子父類的構造方法發的執行過程
子類的所有的構造方法預設都會去通路父類的無參構造方法。
先進行父類初始化,然後進行子類初始化。
(12)繼承案例:
繼承前案例
繼承後案例
做設計的時候,先找到具體的事物,然後發現具體的事物的共性,再提取出一個父類。
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】