java基礎學習_面向對象(下)01_day08總結
=============================================================================
=============================================================================
涉及到的知識點有:
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:繼承(掌握)
(0)Java繼承概述
(1)繼承定義:把多個類中相同的成員給提取出來定義到一個獨立的類中。然後讓這多個類和該獨立的類產生一個關系,這多個類就具備了這些內容。這個關系叫繼承。
(2)Java中如何表示繼承呢?格式是什麽呢?
A:用關鍵字extends表示。
B:格式:
class 子類名 extends 父類名 {}
---------------------------------------
(3)繼承的好處:
A:提高了代碼的復用性。
B:提高了代碼的維護性。
C:讓類與類之間產生了一個關系,是多態的前提。
類與類產生了關系,其實也是繼承的一個弊端:
類的耦合性增強了。
---------------------------------------
(4)繼承的弊端:
A:讓類的耦合性增強。這樣某個類的改變,就會影響其他和該類相關的類。
開發設計的原則:低耦合,高內聚。
耦合:類與類之間的關系。
內聚:自己完成某件事情的能力。
B:打破了封裝性。
因為我們曾經說過:一個類中的成員盡量不要讓外界直接訪問,子類繼承父類後,那麽父類的封裝就被打破了。
---------------------------------------
(5)Java中繼承的特點:
A:Java中類只支持單繼承,不支持多繼承。
即:一個類只能有一個父類,不可以有多個父類。
class Father {}
class Mother {}
class Son exnteds Father {} //正確的
class Son extends Father,Mother {} //錯誤的
有些語言是支持多繼承的額,比如c++。其格式是:extends 類1,類2,...
B:Java中可以多層(重)繼承(繼承體系)
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 show2(){}
public void show3(){}
}
//我們發現B類中出現了和A類一樣的show2()方法,所以,我們就用繼承來體現。
class B extends A {
public void show3(){}
}
這樣其實不好,因為這樣你不但有了show2(),而且還多了show1()。
有可能show1()不是你想要的。
---------------------------------------
(7)那麽什麽時候使用繼承呢?
A:繼承體現的是:is a的關系。
例如:
Person
Student
Teacher
水果
蘋果
香蕉
橘子
B:采用假設法。
假設有兩個類A,B。只有他們符合A是B的一種,或者B是A的一種的時候,就可以考慮使用繼承。
---------------------------------------
(8)Java繼承中的成員關系:
A:成員變量
a:子類的成員變量名稱和父類中的成員變量名稱不一樣時,這個太簡單。
b:子類的成員變量名稱和父類中的成員變量名稱一樣時,這個怎麽訪問呢?
在子類的方法中訪問一個成員變量的查找順序:
1.在子類方法的局部範圍找,有就使用。
2.在子類的成員範圍找,有就使用。
3.在父類的成員範圍找,有就使用。
4.都找不到,就報錯。
B:構造方法
a:子類的所有的構造方法默認都會去訪問父類的無參構造方法。
因為子類會繼承父類中的數據,可能還會使用父類的數據。
所以,子類初始化之前,一定要先完成父類數據的初始化。
特別註意:其實子類的每一個構造方法的第一條語句默認都是:super();
b:父類中如果沒有無參構造方法(也即父類中只給了帶參構造方法),子類的構造方法怎麽辦?
法1:子類的構造方法通過 super(...); 去顯示調用父類的帶參構造方法。
法2:子類的構造方法通過 this();/this(...); 調用本類的其他的構造方法,但是子類的其他的構造方法中一定會有一個去訪問了父類的帶參構造方法。
法3:讓父類提供無參構造。
註意事項: this();/this(...);/super(...); 這三個語句訪問子類或父類的構造方法的時候,必須放在第一句語句上。
否則,就可能會對父類數據進行多次初始化。
C:成員方法
a:子類的成員方法名稱和父類中的成員方法名稱不一樣時,這個太簡單。
b:子類的成員方法名稱和父類中的成員方法名稱一樣時,這個怎麽訪問呢?
通過子類對象訪問一個成員方法的查找順序:
1.在子類的成員方法中找,有就使用。
2.在父類的成員方法中找,有就使用。
3.都找不到,就報錯。
---------------------------------------
(9)方法重寫:(方法=成員方法)
方法重寫:子類中出現了和父類中方法聲明一模一樣的方法(方法名、參數列表和返回值類型都一樣),也被稱為方法覆蓋、方法復寫。
方法重載:本類中出現的方法名一樣,參數列表不同,與返回值類型無關的方法。
方法重寫的使用特點:
如果子類和父類的方法名不同,就調用各自對應的方法。
如果子類和父類的方法名相同,最終使用的是子類自己的方法。
方法重寫的應用:
當子類需要父類的功能,而功能的主體子類還有自己特有的內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類自己特有的內容。
方法重寫的註意事項:
1.父類中的私有方法不能被重寫。
因為父類私有方法子類根本無法繼承。
2.子類重寫父類方法時,訪問權限不能更低。(最好權限要一致。)
默認的權限要小於public的權限。
3.父類的靜態方法,子類也必須通過靜態方法進行重寫。
(其實這個算不上方法重寫,但是現象確實如此,至於為什麽算不上方法重寫,多態中我會講解。)
小結:子類重寫父類方法的時候,最好聲明一模一樣。
---------------------------------------
(10)方法重寫的兩個面試題:
A:Override和Overload的區別?Overload是否可以改變返回值類型?
方法重寫:
在子類中,出現和父類中一模一樣的方法聲明的現象。(包含方法名、參數列表和返回值類型都一樣)
方法重載:
同一個類中,出現的方法名相同,參數列表不同,與返回值類型無關的現象。
方法重載能改變返回值類型,因為它和返回值類型無關。
Override:方法重寫
Overload:方法重載
B:this和super的區別和各自的作用?
this: 代表當前類的對象引用。
super:代表父類存儲空間的標識。(可以理解為父類的引用,通過這個東西可以訪問父類的成員。)
應用場景:
成員變量:
this.成員變量
super.成員變量
構造方法:
this(...)
super(...)
成員方法:
this.成員方法
super.成員方法
---------------------------------------
(11)數據初始化的面試題
A:一個類的初始化過程
先進行成員變量的初始化:
默認初始化
顯示初始化
構造方法初始化
B:子父類的構造方法發的執行過程
子類的所有的構造方法默認都會去訪問父類的無參構造方法。
C:子父類的初始化(分層初始化)
先進行父類初始化,然後進行子類初始化。
---------------------------------------
(12)繼承案例:
A:學生和老師案例
繼承前案例
繼承後案例
B:貓狗案例的分析和實現
做設計的時候,先找到具體的事物,然後發現具體的事物的共性,再提取出一個父類。
=============================================================================
java基礎學習_面向對象(下)01_day08總結