詳解java封裝繼承多態(tài)
面向對象編程(Object Oriented Programming)有三大特性:封裝、繼承、多態(tài)。在這里,和大家一起加深對三者的理解。
封裝
封裝可以拆開理解,裝,是把數(shù)據(jù)和方法放進了類里;封,把裝進去的數(shù)據(jù)和成員方法加上訪問權限。對于外界,內(nèi)部細節(jié)是透明的,暴露給外面的是它的訪問方法。
繼承
繼承,是為了重用父類代碼。兩個類若具有is a的關系就可以用extends。另外,繼承也為實現(xiàn)多態(tài)做了鋪墊。
多態(tài)
程序中定義的引用變量(java有兩大數(shù)據(jù)類型,內(nèi)部數(shù)據(jù)類型和引用數(shù)據(jù)類型)所指向的具體類型和通過該引用變量發(fā)出的方法調用在編譯時并不確定,而是在程序運行期間才確定,即一個引用變量到低指向哪個類的實例對象,該引用變量發(fā)出的方法調用到底是哪個類中實現(xiàn)的方法,必須在程序運行期間才能決定。
在理解多態(tài)時,總是逃不掉“向上轉型”。
問題的核心在于,一般情況下,在子類繼承父類后,子類具有父類的所有成員和方法。但是在向上轉型之后,子類中一些獨有的成員和方法對于該父類類型的引用變量則“不可見”。
實例
package binaryheap.test;
import java.awt.image.SinglePixelPackedSampleModel;
//創(chuàng)建一個Animal類
class Animal {
public void run() {
System.out.println("Animal在奔跑?。。?);
sing();
}
public void sing() {
System.out.println("Animal在唱歌~~~");
}
}
//創(chuàng)建一個子類繼承父類
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) {
// 創(chuàng)建一個父類引用,但是指向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在唱歌”。
實現(xiàn)多態(tài)的必要條件為:繼承、重寫、向上轉型(或者說父類引用指向子類對象)。其實現(xiàn)機制為:調用那個方法是由被引用對象的類型決定,而不是引用變量的類型決定的,并且這個被調用的方法必須是被子類重寫過的。
總結:
- 使用父類的引用指向子類對象
- 該引用只能調用父類中定義的方法和變量
- 若子類重寫了父類的一個方法(只能重寫方法,不能重寫變量,否則編譯時期會報錯),那么調用的時候會調用子類的這個方法。
此外,在多態(tài)引用時,可能會涉及到超類的構造方法。調用超類的構造方法的順序是先調用最遠的超類的構造方法。
以上所述是小編給大家介紹的java封裝繼承多態(tài)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
詳解為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較
這篇文章主要介紹了詳解為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Java找出兩個大數(shù)據(jù)量List集合中的不同元素的方法總結
本文將帶大家了解如何快速的找出兩個相似度非常高的List集合里的不同元素。主要通過Java API、List集合雙層遍歷比較不同、借助Map集合查找三種方式,需要的可以參考一下2022-10-10
Eclipse 導出可執(zhí)行Java工程/可執(zhí)行Jar文件(包含第三方Jar包)
這篇文章主要介紹了Eclipse 導出可執(zhí)行Java工程/可執(zhí)行Jar文件(包含第三方Jar包)的相關資料,需要的朋友可以參考下2016-11-11
關于.java編譯成.class?與?.class反編譯成.java問題
這篇文章主要介紹了關于.java編譯成.class?與?.class反編譯成.java問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09
SpringBoot+WebSocket向前端推送消息的實現(xiàn)示例
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議,允許服務器主動向客戶端推送信息,同時也能從客戶端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實現(xiàn)示例,感興趣的可以了解一下2024-08-08

