三大特性之繼承
繼承 :顧名思義,繼任,承接,傳承的意思。Java中的繼承使用的是extends關鍵字,繼承的類叫做子類(派生類或者超類),被繼承的類叫做父類(或者基類)。凡是這種可以有包含關系的類都能實作繼承關系。
如果兩個類存在繼承關系,則子類會自動繼承父類的方法和變量,在子類中可以調用父類的方法和變量。在java中,隻允許單繼承,也就是說 一個類最多隻能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。
1.子類繼承父類的成員變量
當子類繼承了某個類之後,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:
1)能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;
2)對于父類的包通路權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對于子類可以繼承的父類成員變量,如果在子類中出現了同名稱的成員變量,則會發生隐藏現象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中通路父類中同名成員變量,需要使用super關鍵字來進行引用。
2.子類繼承父類的方法
同樣地,子類也并不是完全繼承父類的所有方法。
1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;
2)對于父類的包通路權限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對于子類可以繼承的父類成員方法,如果在子類中出現了同名稱的成員方法,則稱為覆寫,即子類的成員方法會覆寫掉父類的同名成員方法。如果要在子類中通路父類中同名成員方法,需要使用super關鍵字來進行引用。
注意:隐藏和覆寫是不同的。隐藏是針對成員變量和靜态方法的,而覆寫是針對普通方法的。(後面會講到)
3.構造器(構造器就是我們在new 這個類時 可以構造的類(就是有參 無參,有無傳回值的差別))
子類是不能夠繼承父類的構造器,但是要注意的是,如果父類的構造器都是帶有參數的,則必須在子類的構造器中顯示地通過super關鍵字調用父類的構造器并配以适當的參數清單。如果父類有無參構造器,則在子類的構造器中用super關鍵字調用父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動調用父類的無參構造器。
4.super
super主要有兩種用法:
1)super.成員變量/super.成員方法;
2)super(param1,param2…)
第一種用法主要用來在子類中調用父類的同名成員變量或者方法;第二種主要用在子類的構造器中顯示地調用父類的構造器,要注意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。
說到繼承,不得不提的就是重載和重寫。
重寫規則
- 參數清單:必須與被重寫方法的參數清單完全比對。
- 傳回類型:必須與超類中被重寫的方法中聲明的傳回類型或子類型完全相同
- 通路級别:一定不能比被重寫方法強,可以比被重寫方法的弱。
- 非檢查異常:重寫方法可以抛出任何非檢查的異常,無論被重寫方法是否聲明了該異常。
- 檢查異常:重寫方法一定不能抛出新的檢查異常,或比被重寫方法聲明的檢查異常更廣的檢查異常
- 不能重寫标志為final,static的方法
其中:
1. 父類與子類之間的多态性,對父類的函數進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。方法重寫又稱方法覆寫。
2. 若子類中的方法與父類中的某一方法具有相同的方法名、傳回類型和參數表,則新方法将覆寫原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了目前類的父類。
3. 子類函數的通路修飾權限不能少于父類的;
重載方法的規則:
1. 參數清單:被重載的方法必須改變參數清單。
2. 傳回類型:可以改變傳回類型。
3. 修飾符:可以改變修飾符
4. 異常:可以聲明新的或者更廣泛的異常。
其中:
1. 方法重載是讓類以統一的方式處理不同類型資料的一種手段。多個同名函數同時存在,具有不同的參數個數/類型。重載Overloading是一個類中多态性的一種表現。
2. Java的方法重載,就是在類中可以建立多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法, 這就是多态性。
3. 重載的時候,方法名要一樣,但是參數類型和個數不一樣,傳回值類型可以相同也可以不相同。無法以傳回型别作為重載函數的區分标準。
方法的重寫Overriding和重載Overloading是Java多态性的不同表現。重寫Overriding是父類與子類之間多态性的一種表現,重載Overloading是一個類中多态性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。
子類的對象使用這個方法時,将調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了,而且如果子類的方法名和參數類型和個數都和父類相同,那麼子類的傳回值類型必須和父類的相同;如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變傳回值的類型。也就是說,重載的傳回值類型可以相同也可以不同。
如有錯誤,敬請指出。。。
ps:因為是好久之前寫的了,我也不記得哪些是從别的文章中摘過來的了。敬請諒解。