繼承就是子類繼承父類的特征和行為,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為(概念是網上抄的,可以不看),Java中用extends關鍵字表示繼承。
成都創(chuàng)新互聯(lián)公司主營鶴山網站建設的網絡公司,主營網站建設方案,重慶APP軟件開發(fā),鶴山h5微信小程序開發(fā)搭建,鶴山網站營銷推廣歡迎鶴山等地區(qū)企業(yè)咨詢通俗解釋:Fig.1 簡單的繼承關系
Tips:子類不僅繼承了父類的方法,而且還繼承了父類的實例變量。
子類繼承的實例變量實際上是對父類中實例變量的拷貝,在子類中修改實例變量的值,只會改變子類中該實例變量的值,并不會影響父類中的實例變量。
//結果就是:class B的instanceVariable的值變?yōu)?00,而A和C的instanceVariable的值仍然為1。
public class myTest{
public static void main(String[] args){
B b = new B();
b.instanceVariable = 100;
}
}
class A{
public int instanceVariable = 1;
public void sonMethod(){};
}
class B extends A{
public void sonMethod(){};
}
class C extends A{
public void sonMethod(){};
}
二、深入理解
繼承是將多個子類的共同屬性抽象出來,組成父類。父類是較為抽象的類,而子類是較為具體的類。以動物為例子,見Fig.2,動物都有叫(makeNoise)、吃(eat)、睡覺(sleep)和散步(roam)的行為(方法),因此將其抽象出來作為父類。
Fig.2 動物的繼承關系
However!雖然動物都可以叫(makeNoise),但是他們的叫聲并不相同,貓是喵嗚喵嗚的叫,狗是汪汪的叫,河馬是......我也不知道它怎么叫。因此出現(xiàn)了方法的重寫(override),即子類不僅能繼承父類,但能在父類的基礎上做拓展和改進(兒子不僅繼承了父親的財富,還在父親的基礎上變的更有錢)。
tips:繼承下來的方法可以被覆蓋掉,但是實例變量不可以被覆蓋。
三、方法的重寫(override)是什么?子類可以根據需要,定義屬于自己的行為。既沿襲了父類的功能和名稱。又根據子類的需要重新實現(xiàn)父類方法,從而進行拓展和增強。
通俗的講,就是在子類中如果創(chuàng)建了一個與父類相同名稱、相同返回值類型、相同參數列表的方法(即和父類中的方法一模一樣),只是方法體中的實現(xiàn)不同,以實現(xiàn)不同于父類的功能。當父類中的方法無法滿足子類需求或子類具有特有功能的時候,需要方法重寫。
但是重寫(override)有以下的限制:
Tips: 什么是方法的重載(overload)?
方法的重載是指兩個方法的名稱相同,但參數不同。(它與繼承or多態(tài)沒有關系)
這一點不用擔心,當調用對象的方法時,JVM會首先從最低階的開始找起,從下往上,一直找到為止,如Fig.3所示。
Fig.3 對象引用哪個方法
五、怎么判斷繼承設計的合理與否?有一個簡單的判斷方法——“IS-A”測試,這是一個判斷思想。例如:三角形是is a多邊形;外科醫(yī)生is a醫(yī)生等等。需要注意,“IS-A”測試是單向的!例如,多邊形is a三角形,就是錯的。
如果繼承層次樹設計的合理,那么所有的子類都會通過任意一個上層父類的IS-A測試。例如:B是C的父類,而A又是B的父類,那么C也應該能通過is?a?A的測試。
六、子類中,先使用父類的方法,再加上額外的功能還是以上述中的動物類為例,如果我們想使用父類的roam()方法,但同時又想再額外加上我們自己的roam()方法,這時就要使用關鍵字super。
public void roam(){
super.roam();
//下面是my own roam()
......
......
}
這樣會先執(zhí)行父類的roam()方法,然后再執(zhí)行下面的my own roam()方法。
七、繼承的意義你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧