《Java程式設計》第6周學習總結
201711671201《Java程式設計》第6周學習總結
教材學習內容總結
第5章:子類與繼承
5.1 子類與父類
繼承是一種由已有的類建立新類的機制。先定義一個共有屬性的一般類,再定義具有特殊屬性的子類。
由繼承得到的類稱為子類,被繼承的類稱為父類(超類)。
Java不支援多重繼承,即子類只能有一個父類。
5.1.1 子類
在類的宣告中,通過使用關鍵字extends來定義一個類的子類,格式如下:
class 子類名 extends 父類名 {
…
}
5.1.2 類的樹形結構
Java的類按繼承關係形成樹形結構(將類看作樹上的結點),在這個樹形結構中,根結點是Object類
如果一個類(除了Object類)的宣告中沒有使用extends關鍵字,這個類被系統預設為是Object的子類。
5.2 子類的繼承性
子類的成員中有一部分是子類自己宣告、定義的,另一部分是從它的父類繼承的。
5.2.1 子類和父類在同一包中的繼承性
如果子類和父類在同一個包中,子類繼承了其父類中不是private的成員變數和方法作為自己的成員變數和方法,繼承的成員變數或方法的訪問許可權保持不變。
5.2.2 子類和父類不在同一包中的繼承性
當子類和父類不在同一個包中,子類只繼承
5.2.3 繼承關係的UML圖:
實線的起始端是子類,終點端是父類,終點端使用一個空心三角形表示實線的結束。
5.3 子類與物件
5.3.1 子類物件的特點
子類建立物件時,子類的構造方法總是先呼叫父類的某個構造方法,此時不僅子類中宣告的成員變數被分配了記憶體,父類的成員變數也都分配了記憶體空間,但子類只能操作繼承的那部分成員變數。
5.3.2 關於instanceof運算子
是Java獨有的雙目運算子,左面的操作元是物件,右面的操作元是類,當左面的操作元是右面的類或其子類所建立的物件時,instanceof運算的結果是true
5.4 成員變數的隱藏和方法重寫
5.4.1 成員變數的隱藏
子類所宣告的成員變數的名字和從父類繼承來的成員變數的名字相同(宣告的型別可以不同),子類就會隱藏所繼承的成員變數。
特點:1.子類物件以及子類自己定義的方法操作與父類同名的成員變數是指子類重新宣告的這個成員變數。
2.子類物件仍然可以呼叫從父類繼承的方法操作被子類隱藏的成員變數,也就是說,子類繼承的方法所操作的成員變數一定是被子類繼承或隱藏的成員變數。
注:子類繼承的方法只能操作子類繼承和隱藏的成員變數。
子類新定義的方法可以操作子類繼承和子類新宣告的成員變數,但無法操作子類隱藏的成員變數(需使用super關鍵字操作子類隱藏的成員變數)。
5.4.2 方法重寫
子類通過重寫可以隱藏已繼承的方法(方法重寫稱為方法覆蓋)。
1、重寫的語法規則:所謂方法重寫,是指子類中定義一個方法,這個方法的型別和父類的方法的型別一致或者是父類的方法的型別的子型別(所謂子型別,是指如果父類的方法的型別是“類”,那麼允許子類的重寫方法的型別是“子類”),並且這個方法的名字、引數個數、引數的型別和父類的方法完全相同。(重寫方法的型別可以是父類方法型別的子型別,即不必完全一致。)
2、重寫的目的:隱藏繼承的方法。
重寫方法既可以操作繼承的成員變數、呼叫繼承的方法,也可以操作子類新宣告的成員變數、呼叫新定義的其他方法,但無法操作被子類隱藏的成員變數和方法。(如果子類想使用被隱藏的方法或成員變數,必須使用關鍵字super。)
3、重寫的注意事項:不允許降低方法的訪問許可權,但可以提高訪問許可權(訪問許可權從高到低:public、protected、友好的、private)。
5.5 super關鍵字
5.5.1 用super操作被隱藏的成員變數和方法
在子類中想使用被隱藏的成員變數或方法,使用關鍵字super。例如super.x、super.play()就是訪問和呼叫被子類隱藏的成員變數x和方法play()。
5.5.2 使用super呼叫父類的構造方法
如果子類的構造方法沒有明顯地指明使用父類的哪個構造方法,子類就呼叫父類的不帶引數的構造方法。
子類不繼承父類的構造方法,子類在其構造方法中需使用super來呼叫父類的構造方法,而且super必須是子類構造方法中的頭一條語句,即如果在子類的構造方法中,沒有明顯地寫出super關鍵字來呼叫父類的某個構造方法,那麼預設地有:
super();
當在父類中定義多個構造方法時,應當包括一個不帶引數的構造方法,以防子類省略super時出現錯誤。
5.6 final關鍵字
final關鍵字可以修飾類、成員變數和方法中的區域性變數。
5.6.1 final類:不能被繼承,即不能有子類。
5.6.2 final方法
如果用final修飾父類中的一個方法,那麼這個方法不允許子類重寫,也就是說,不允許子類隱藏可以繼承的final方法(老老實實繼承,不許做任何篡改)。
5.6.3 常量
如果成員變數或區域性變數被修飾為final,那它就是常量。由於常量在執行期間不允許再發生變化,所以常量在宣告時沒有預設值,這就要求程式在宣告常量時必須指定該常量的值。
5.7 物件的上轉型物件(子類的物件賦給父類的物件。)
當用子類建立一個物件,並把這個物件的引用放到父類的物件中時,稱物件a是物件b的上轉型物件,例如:
A a;
a=new B();
或
A a;
B b=new B();
a=b;
(1)上轉型物件不能操作子類新增的成員變數(失掉了這部分屬性),不能呼叫子類新增的方法(失掉了一些行為)。
(2)上轉型物件可以訪問子類繼承或隱藏的成員變數,也可以呼叫子類繼承的方法或子類重寫的例項方法。
如果子類重寫了父類的某個例項方法後,當物件的上轉型物件呼叫這個例項方法時一定是呼叫了子類重寫的例項方法。
如果子類重寫了父類的靜態方法,那麼子類物件的上轉型物件不能呼叫子類重寫的靜態方法,只能呼叫父類的靜態方法。
5.8 繼承與多型
多型性就是指父類的某個方法被其子類重寫時,可以各自產生自己的功能行為。
上轉型是多型的表現形式,通過子類對父類方法的重寫來實現。
5.9 abstract類和abstract方法
用關鍵字abstract修飾的類稱為abstract類(抽象類),例如:
abstract class A {
…
}
用關鍵字abstract修飾的方法稱為abstract方法(抽象方法),例如:
abstract int min(int x,int y);
對於abstract方法,只允許宣告,不允許實現(沒有方法體),而且不允許使用final和abstract同時修飾一個方法或類,也不允許使用static修飾abstract方法,即abstract方法必須是例項方法。
1、abstract類中可以有abstract方法(非abstract類中不可以有abstract方法),也可以有非abstract方法。
注:abstract類裡也可以沒有abstract方法。
2、abstract類不能使用new運算子建立物件,如果一個非抽象類是某個抽象類的子類,那麼它必須重寫父類的抽象方法,給出方法體。
3、abstract類的子類:如果一個abstract類是abstract類的子類,它可以重寫父類的abstract方法,也可以繼承父類的abstract方法。
4、abstract類的物件作上轉型物件:abstract類的物件可以成為其子類物件的上轉型物件,該物件可以呼叫子類重寫的方法。
5、理解abstract類
理解的關鍵點是:
1、抽象類可以抽象出重要的行為標準,該行為標準用抽象方法來表示。即抽象類封裝了子類必須要有的行為標準。
2、抽象類宣告的物件可以成為其子類的物件的上轉型物件,呼叫子類重寫的方法,即體現子類根據抽象類裡的行為標準給出的具體行為。
抽象方法(沒有方法體的方法)
5.10 面向抽象程式設計
所謂面向抽象程式設計,是指當設計某種重要的類時,不讓該類面向具體的類,而是面向抽象類,即所設計類中的重要資料是抽象類宣告的物件,而不是具體類宣告的物件。
面向抽象程式設計的目的是為了應對使用者需求的變化,將某個類中經常因需求變化而需要改動的程式碼從該類中分離出去。
面向抽象程式設計的核心是讓類中每種可能的變化對應地交給抽象類的一個子類去負責,從而讓該類的設計者不去關心具體實現,避免所設計的類依賴於具體的實現。
5.11 開-閉原則
所謂“開-閉原則”,就是讓設計的系統對擴充套件開放,對修改關閉。這句話的本質是指當系統中增加新的模組時,不需要修改現有的模組。
如果系統的設計遵守了“開-閉原則”,那麼這個系統一定是易維護的,因為在系統中增加新的模組時,不必去修改系統中的核心模組。
5.13 小結
子類繼承過程中可以實現變數隱藏與方法重寫。
教材學習中的問題和解決過程
無。
程式碼除錯中的問題和解決過程
無。
感悟
課後要及時複習,不然會忘掉一些知識。
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
目標 | 5000行 | 30篇 | 400小時 | |
第六週 | 30/400 | 0/5 | 2/20 |