更新時間:2020-06-23 13:32:15 來源:動力節點 瀏覽2430次
面向對象編程(Object Oriented Programming)有三大特性:封裝、繼承、多態。在這里,和大家一起加深對三者的理解。
封裝
封裝可以拆開理解,裝,是把數據和方法放進了類里;封,把裝進去的數據和成員方法加上訪問權限。對于外界,內部細節是透明的,暴露給外面的是它的訪問方法。
繼承
繼承,是為了重用父類代碼。兩個類若具有is a的關系就可以用extends。另外,繼承也為實現多態做了鋪墊。
多態
程序中定義的引用變量(java有兩大數據類型,內部數據類型和引用數據類型)所指向的具體類型和通過該引用變量發出的方法調用在編譯時并不確定,而是在程序運行期間才確定,即一個引用變量到低指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在程序運行期間才能決定。
在理解多態時,總是逃不掉“向上轉型”。
問題的核心在于,一般情況下,在子類繼承父類后,子類具有父類的所有成員和方法。但是在向上轉型之后,子類中一些獨有的成員和方法對于該父類類型的引用變量則“不可見”。
實例
package?binaryheap.test;
import?java.awt.image.SinglePixelPackedSampleModel;
//創建一個Animal類
class?Animal?{
????public?void?run()?{
????????System.out.println("Animal在奔跑!!!");
????????sing();
????}
?
????public?void?sing()?{
????????System.out.println("Animal在唱歌~~~");
????}
?
}
?
//創建一個子類繼承父類
class?Lion?extends?Animal?{
????//?重載run()方法,和父類中的run()方法不是一個
????//?向上轉型時會丟失該方法
????public?void?run(String?anotherAnimal)?{
?
????????System.out.println(("Lion在追一只"?+?anotherAnimal));;
????????sing();
????}
????//?重寫
????public?void?sing()?{
????????System.out.println("Lion在唱歌~~~");
????}
}
?
public?class?BH?{
????public?static?void?main(String[]?args)?{
????????//?創建一個父類引用,但是指向Lion對象
????????Animal?animal?=?new?Lion();
????????animal.run();
????}
}
結果:
Animal在奔跑!!!
Lion在唱歌~~~
Animal animal=new Lion();向上轉型后的Animal類型的引用,丟失了重載的方法run(),即子類中的run(),指向的是父類的run(),因此輸出“Animal在奔跑”,而不是“Lion在奔跑”。run()方法中調用了sing()方法,因為sing()方法被重寫,引用能夠找到sing()方法,因此引用調用此sing()方法(動然調用),輸出“Lion在唱歌”。
實現多態的必要條件為:繼承、重寫、向上轉型(或者說父類引用指向子類對象)。其實現機制為:調用那個方法是由被引用對象的類型決定,而不是引用變量的類型決定的,并且這個被調用的方法必須是被子類重寫過的。
總結:
•使用父類的引用指向子類對象
•該引用只能調用父類中定義的方法和變量
•若子類重寫了父類的一個方法(只能重寫方法,不能重寫變量,否則編譯時期會報錯),那么調用的時候會調用子類的這個方法。
此外,在多態引用時,可能會涉及到超類的構造方法。調用超類的構造方法的順序是先調用最遠的超類的構造方法。
以上就是動力節點java培訓機構的小編針對“詳解Java封裝繼承多態,初學者必看”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習