1.多態(tài)的體現(xiàn)
父類 對象名 = new 子類();
func(父類 子類對象){}
父類的引用指向了自己的子類對象;
父類的引用可以接受自己的子類對象。
2.多態(tài)的前提
必須是類與類之間有extends/implements關(guān)系。
還有一個前提,子類對父類的成員存在覆蓋
3.多態(tài)的特點
提高了程序的擴展性,但只能使用父類的引用訪問父類的成員
4.多態(tài)的應(yīng)用
類型提升(向上轉(zhuǎn)型):子類提升為父類。父類引用指向子類對象。Animal a = new Cat();
想調(diào)用子類的方法時,需要向下轉(zhuǎn)型(強制將父類的引用轉(zhuǎn)成子類類型)。Cat c = (Cat)a,? ? c.方法? 實現(xiàn)調(diào)用
不可以將父類對象轉(zhuǎn)成子類類型的引用。多態(tài)始終都是子類對象在做著變化。
但是如果向帶有父類引用參數(shù)的方法中傳入其他子類對象,雖然編譯通過但是運行會出錯(類型轉(zhuǎn)換異常)。因此可以使用引用數(shù)據(jù)類型之間的判斷(引用變量 instanceof 類型),從而使用特定子類類型進行指定操作
例如傳入Animal a,則判斷是if(a instanceof Cat)
多態(tài)中非靜態(tài)成員的函數(shù)
編譯時:參閱引用型變量所屬的類中是否有需要調(diào)用的方法,如果有,編譯通過,如果類中沒有需要調(diào)用的方法則編譯失敗。
運行時:參閱對象所屬的類中是否有需要調(diào)用的方法。
編譯看左邊,運行看右邊
注意:多態(tài)中,成員變量的特點。無論編譯和運行,變量的值都參考左邊(引用變量所屬類)。多態(tài)中,靜態(tài)成員函數(shù)無論編譯和運行都參考左邊(這是因為靜態(tài)比對象先加載,靜態(tài)綁定,等于類名.成員,而動態(tài)的是this.)。
舉例:主板、多態(tài)
實現(xiàn):插入網(wǎng)卡時調(diào)用網(wǎng)卡的功能,插入聲卡時調(diào)用聲卡的功能,即插即用
步驟:
定義一個PCI接口,使得網(wǎng)卡、聲卡等類implementsPCI,在調(diào)用的時候有PCI p = new 網(wǎng)卡();傳入一個PIC型的引用變量,相當于父類引用子類對象,子類對接口的功能進行復(fù)寫,從而對子類的方法進行調(diào)用。
舉例:數(shù)據(jù)庫提高擴展性
步驟:連接數(shù)據(jù)庫,操作數(shù)據(jù)庫(c r u d),關(guān)閉數(shù)據(jù)庫連接
定義了接口,包含抽象方法add,delete,子類實現(xiàn)了接口的方法,調(diào)用時使用多態(tài),使主程序調(diào)用重寫后的子類方法,每當我們需要用到新的數(shù)據(jù)庫類型時,只需要讓新子類實現(xiàn)接口,然后作為子類調(diào)用即可
Object類:是所有對象的直接后者間接父親,定義了所有對象都具備的功能。
所有的對象都能比較。equals()方法比較地址值,只要是Object都能比較,因此不管對象是什么類,都是Object的子類,都是多態(tài)。
通過向下轉(zhuǎn)型,對equals方法進行重寫,如果要用到對象的屬性,需要進行類型轉(zhuǎn)換和判斷。如果是不同的類進行比較,則通過instanceof判斷直接返回false。
toString():返回對象的字符串表示
hashCode():返回對象的哈希值
getClass()
getMethod():連private都能獲取
getName()
這些都沒有意義,可以在類中根據(jù)需要進行復(fù)寫
內(nèi)部類
內(nèi)部類可以直接訪問外部類的成員,包括private