作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
1.基本語法:
public class Sub extends Base{
}
當Sub和Base在同一個package時,Sub繼承了Base中的public、protected和默認(即未指定訪問級別)訪問級別的成員變量和方法。
當Sub和Base在不同package時,Sub繼承了Base中的public、protected訪問級別的成員變量和方法。
2.Java不支持多重繼承,但可以通過串行的間接繼承進行多重繼承
3.所有Java類都直接或間接的集成了java.lang.object類。Object類定義了Java對象具有的相同行為。
4.重載overload
同一個類中,相同名字的方法,但是參數類型、個數或者順序至少有一項不同。
5.覆蓋override
子類覆蓋了父類的方法,子類方法的名字、參數簽名、返回類型必須與父類相同。若想怪邊返回類型等,但是還想用同一個名字,則可以使用先覆蓋再重載的策略:
public class Base{
public void method(){
}
}
public class Sub extends Base{
public void method(){//覆蓋Base類的method方法
}
public int method(int a){//重載Sub類的method方法
}
}
注意:
a.子類方法不能縮小父類方法的訪問權限(可以擴大),而且子類不能拋出比父類方法更多的異常,其必須拋出和父類方法拋出的相同的異常,或者子類方法拋出的異常類是父類方法拋出的異常類的子類。
b.父類的靜態方法不能被子類覆蓋為非靜態方法。同樣,父類的非靜態方法不能被子類覆蓋為靜態方法。
c.子類可以定義與父類的靜態方法同名的靜態方法,以便在父類中隱藏父類的靜態方法。子類覆蓋靜態方法和覆蓋一般方法的區別是,運行時,JVM把靜態方法和所屬類綁定,而將一般方法和所屬實例綁定。
d.父類的私有方法不能被子類覆蓋。雖然不會出現編譯錯誤,但是實際上子類並沒有從父類繼承這個方法,所以,其並沒有覆蓋關系。
e.父類的抽象方法通過子類實現父類的抽象方法或者子類重新聲明父類的抽象方法來實現覆蓋。
f.父類的非抽象方法可以被覆蓋為抽象方法。
6.super關鍵字
super和this的功能都是使被屏蔽的方法或變量變為可見。不能在靜態方法或者靜態代碼塊內不能使用super關鍵字。
7.多態
實質:指當系統A訪問系統B的服務時,系統B可以通過多種實現方式來提供服務,而這一切對系統A是透明的。例如:
public class Feeder{
public void feed(Animal animal,Food food){
animal.eat(food);
}
}
Feeder feeder=new Feeder();
Animal animal=new Dog();
Food food = new Bone();
feeder.feed(animal,food);//喂狗骨頭吃
animal=new Cat();
food = new Fish();
feeder.feed(animal,food);//喂貓魚吃
注意animal被定義為Animal類型,但是有可能引用Dog或Cat類型,在調用animal.eat的時候,JVM會執行animal變量所引用的實例的eat方法。
需要注意的是:
1)靜態綁定:對於一個引用類型的變量,Java編譯器按照它聲明的類型來處理。例如,Base who = new Sub();
這個who是Base類型的引用變量,Java編譯器就會按照Base類型來處理。要訪問Sub類的成員,則使用強制類型轉換:((sub)who).subVar="123";
這適用於成員變量(包括靜態變量和實例變量),靜態方法
2)動態綁定:對於一個引用類型的變量,運行時JVM按照其實際引用的對象的方法進行綁定。實例方法就屬於這一類。
3)Java允許在具有直接或間接的繼承關系的類之間進行類型轉換,對於向上轉型,不必使用強制類型轉換。
繼承的利弊:
提高代碼可重用性,是提高系統擴展性的有效手段。但是繼承樹若是異常復雜,或被隨意擴展,反而會削弱系統的可擴展性和可維護性。繼承的最大弱點是打破了封裝,削弱了子類的獨立性。
繼承的原則:
1)不考慮Object,繼承樹應該盡量保持在兩到三層。
2)當一個系統使用一棵繼承樹上的類時,應該盡可能地把引用變量聲明為繼承樹的上層類型。
3)若繼承樹上有接口類型,那么應該盡可能地把引用變量聲明為繼承樹上層的接口類型。
4)上層完成那些適用於所有子類或大多數子類的方法,否則則設定為抽象方法。
5)在設計繼承類的時候,盡可能的封裝父類的實現細節,也就是把代表實現細節的屬性和方法定義為private類型,若某些實現細節必須被子類訪問則設為protected類型。
6)將不允許子類覆蓋的方法定義為final類型。
7)父類的構造方法中不要調用可以被子類覆蓋的方法。
8)某些類不是為了繼承而設計的,那么采用將類聲明為final類型,或者將這個類的所有構造方法聲明為private類型,然后通過一些靜態方法來負責構造自身的實例的兩種方法禁止繼承。
9)對於一棵設計合理的繼承樹,子類之間會具有不同的屬性和行為。
10)組合關系指的是:類A中包含有類C的屬性,則類A稱為包裝類(整體類),而類C稱作被包裝類(局部類)。在開發中,組合關系雖然不比繼承關系減少代碼量,但是維護起來,有更好的松耦合性。不使用繼承,而是在類中加入要繼承的類的一個實例成員就是組合。繼承關系是靜態的,在運行時,子類無法改變它的弗雷,但組合關系在運行時可以根據需要改變實現方式。在繼承關系中,子類只能繼承父類的接口,不能取消父類的方法,但是除非覆蓋該方法,並直接拋出java.lang.UnsupportedOperationExcepetion。而組合則不會自動去繼承父類的方法。