第一點:
多態(tài)的確定:在程序中,多態(tài)就是用父類的引用指向子類 的對象 例如:Person p = new Student(); Person是父類,Student是子類
第二點:
工作的機制:1、先通過p保存的地址找到Student對象 2、再使用Student對象去工作,實際工作的是對象
第三點:繼承和多態(tài)中調(diào)用成員變量和成員方法比較
情景:父類:Person 子類:Teacher和Student
多態(tài)的前提是繼承,所以有以下繼承
class Person{}
class Teacher extends Person{}
class Student extends Person{}
(1)表現(xiàn)形式:
繼承:Teacher teacher = new Teacher();
多態(tài):Person person = new Teacher();
相同點:對象都是子類(即new Teacher())
不同點:繼承中的引用類型與對象的類型相同(此處是子類Teacher)
多態(tài)中的引用類型是對象類型的父類(此處是Teacher的父類Person的引用)
所以,在調(diào)用成員變量和成員方法中,通過子類類型調(diào)用就是繼承,通過父類類型調(diào)用就是多態(tài)
(2)調(diào)用成員變量
繼承:通過繼承調(diào)用成員變量,調(diào)用順序為子類--->父類--->父類的父類--->...--->基類,知道找到為止就不再向下尋找,此處形式為:teacher.成員變量
多態(tài):通過多態(tài)調(diào)用成員變量,只會且只能調(diào)用父類里面的成員變量,不管是否會向下轉型(向下轉型的目的只是為了用父類的引用來調(diào)用子類特有的方法),如果父類中有該成員變量則對其賦值,否則,編譯錯誤,此處形式為:person.成員變量
(3)調(diào)用成員方法(非靜態(tài)成員方法)
繼承:通過繼承調(diào)用成員方法,調(diào)用順序為子類--->父類--->父類的父類--->...--->基類,知道找到為止就不再向下尋找,此處形式為:teacher.成員方法
多態(tài):
①通過多態(tài)調(diào)用成員方法,如果父類與子類有相同方法名的方法,則不需要向下轉型即可調(diào)用子類的方法(因為最后工作的還是對象,即new Teacher(),如果父類有相同的方法名,則 person.成員方法 只是編譯用,并沒有運行,當運行的時候,就通過對象new Teacher()來調(diào)用成員方法)
②如果通過父類引用要調(diào)用子類中獨有的方法時,就需要向下轉型(強制將父類的引用類型轉成子類的引用轉型:Teacher teacher = (Teacher)person,然后用 teacher.成員方法 來調(diào)用子類特有的方法);
(4)調(diào)用靜態(tài)方法
不管是父類中靜態(tài)方法還是子類的靜態(tài)方法,通過相應的類名調(diào)用即可,是可以實現(xiàn)繼承的
注意:靜態(tài)屬性、靜態(tài)方法和非靜態(tài)的屬性都可以被繼承和隱藏而不能被重寫,因此不能實現(xiàn)多態(tài),不能實現(xiàn)父類的引用可以指向不同子類的對象。非靜態(tài)方法可以被繼承和重寫,因此可以實現(xiàn)多態(tài)。
第四點:
如果一個方法中需要傳入的是Cat的實參,但客戶輸入了Dog類型的實參,這時候就需要做容錯處理,使用instanceof關鍵字(構成: 對象 instanceof 類 結果兩個:true/false):
if(animal1 instanceof Cat){
//干貓的活
}
實際工作中寫成下面這樣:
if(?。╝nimal1 instanceof Cat)){
}
//干貓的活
在多態(tài)的前提下,當確定傳過來的對象確定是Cat的對象,再去干貓的活,否則直接跳過干下面的工作,這樣做可以保證當前位置發(fā)生的問題不影響整個程序的運行,做一個預防的工作---容錯處理.---增加用戶的體驗