繼承性
繼承性的概念
所謂繼承,就是程序猿在保持原有類特性的基礎上進行擴展,增加新功能,這樣的類被稱為派生類或者子類,原有類被稱為超類或者基類。
在對于繼承性概念進行書寫前,我曾查閱許多資料來保證對其表達的通俗性和準確性,但是發現貌似都是晦澀的,不像繼承性和多態性一樣。雖然定義是晦澀的,但是其含義還是很好理解的。
通俗的說,繼承就是A類繼承B類所有屬性和方法,在B類的基礎上進行擴展,增加一些新的功能,從而減少代碼的書寫。
繼承呈現了面向對象程序設計的層次結構,體現了由簡單到復雜的認知過程。
繼承解決的主要問題是:共性的抽取、實現代碼復用、實現多態。
為什么需要繼承性
Java中使用類來對現實世界中的實體進行描述,類經過實例化之后產生的對象,則就能用來表示現實中的實體。但是現實世界錯綜復雜,事物之間可能會存在一些關聯,那在程序設計時就需要進行考慮。
例如現實世界中的貓和狗,他們都屬于動物,自然也就會擁有年齡及體重等屬性。因此在將其抽象化為類時,就要考慮把這些屬性進行抽取。面向對象程序設計就提出了繼承的概念,專門用來進行共性抽取,實現代碼復用。
如何實現繼承性
使用關鍵字extends來實現繼承性。
public class A { // 父類、超類、基類// 屬性和方法
}public class B extends B { // 子類、派生類// 屬性和方法
}
繼承性的好處
1. 繼承的出現減少了代碼的冗余,提高了代碼的復用性。
2. 繼承性的出現,有利于功能的擴展。
3. 繼承描述事物之間的關系是“is-a”的關系,可見父類更通用,子類更具體。
4. 繼承為多態的使用提供了前提。
細節說明
1. Java中聲明的類,如果沒有顯式的聲明其父類時,則默認繼承于java.lang.Object類。
2. A類繼承B類之后,A類擁有B類所有的屬性和方法,但是由于權限修飾符的存在,可能一些屬性和方法無法使用,但是它確實在內存中有,只不過是無法使用而已。
3. A類繼承B類之后,除了繼承B類的所有屬性和方法之外,他還可以增加自己的屬性和方法。
4. 對于繼承性而言,它支持多層繼承,但是只支持單繼承。也就是說,A類可以繼承B類,B類可以繼承C類,C類可以繼承D類,這就是多層繼承;但是A類不能同時繼承B類和C類,只能繼承其中的一個類,這就是單繼承(單繼承屬于Java語言的一個局限性,后續通過類實現接口的方式,來解決單繼承的局限性)。
方法重寫
方法重寫的概念
子類對父類繼承過來的方法進行覆蓋、重寫的操作。
通俗的說,子類在繼承父類之后,子類就獲取了父類中聲明的所有方法,但是子類認為父類的某些方法并不適合自己進行調用,因此就會在子類中重寫方法的內容。
方法重寫的規則
1. 子類重寫父類的方法時,兩個方法的方法名與參數列表必須相同。
2. 子類在重寫父類的方法時,其子類重寫方法的權限修飾符必須不小于父類被重寫方法的權限修飾符。并且對于父類中private權限修飾的方法,子類是不能重寫的。
3. 子類在重寫父類的方法時,當父類被重寫方法的返回值是void或者基本數據類型時,子類重寫方法必須與父類被重寫方法的返回值類型相同。當父類被重寫方法的返回值是引用數據類型時,其子類重寫方法的返回值類型是對應引用數據類型或引用數據類型的子類。
4. 子類在重寫父類方法時,子類重寫方法拋出的異常類型必須是父類拋出異常類型對應類或者子類。
super關鍵字
super的理解
父類的,表示當前類在使用時,直接去直接父類中尋找,如果沒有找到,再去直接父類的直接父類尋找,追根溯源,直到找到或者到Object類中也沒找到,而不在當前類中查找需要調用的結構。如果沒有super,那么就先在本類中進行尋找,如果沒有找到再去繼承類中找。
在【JavaSE】類和對象一文中,曾對this關鍵字進行過簡單介紹。this表示當前對象或者當前正在創造的對象,而super表示當前對象對父類的調用或者當前正在創造的對象對父類的調用。在實例化時,本質上沒有子父類一說,屬性都創建在同一個內存環境中,但是便于理解和調用,使用super表示父類的屬性和方法。
super和this在使用上的結構基本上相同,只是含義不同。
?super可以調用的結構
屬性、構造器、方法。
在構造器中,super可以調用屬性、構造器和方法。但是在普通方法中,super只能調用屬性和方法,不能調用構造器。
super調用屬性、方法
結構:" super. "
子類在繼承父類之后,我們就可以在子類的方法或者構造器中,調用父類的屬性或者方法。一般情況下,都可以省略“super.”的結構,但是如果出現了子類重寫了父類的方法或者子類的屬性和父類的屬性名相同的情況下,還想要調用父類的方法和屬性,那么就要使用“super.”的結構了。
super調用構造器
結構:" super(形參列表) "
1. 子類繼承父類之后,不會繼承父類的構造器,只能通過“super(形參列表)”的形式來調用父類指定的構造器。
2. ”super(形參列表)“必須聲明在構造器的首行,而前面的”this(形參列表)“也必須聲明在構造器的首行。因此兩者在調用時,只能選其一,不能同時存在。
3. 當在構造器中,沒有聲明“super(形參列表)”和“this(形參列表)”時,默認會調用“super()”,也就是當兩者都不存在時,默認會調用父類中空參的構造器。
4. 根據上述可知,在對象實例化時,一個構造器中要么會調用本類重載的構造器,要么會調用父類的構造器。總之一定會直接或間接的調用到父類的構造器,也正是因為調用過父類的構造器,才會把父類中聲明的屬性或方法加載到內存中,供子類對象使用。
5. 一個類中聲明n個構造器,最多有n-1個構造器中使用了this,則剩下的一個構造器一定使用了super。
繼承性,就是子類通過extends關鍵字來繼承父類,從而得到父類中的屬性和方法。通過繼承性,在子類中擴展新的功能,使得代碼的復用性提高,同時也體現了面向對象程序設計中的層次結構。由于繼承性使得子類擁有父類所有的屬性和方法,但是可能父類的某些方法并不適合子類的功能,因此就出現了方法重寫這一概念。