類型的多態(tài)主要體現(xiàn)在:子類是一種父類類型。 子類通過繼承擴(kuò)充和發(fā)展了它的父類,子類是父類的一種特殊類型。 1、子類對象即是父類對象 子類對象包含了父類的所有成員,包括成員變量和成員方法,所以子類對象也是父類對象。 反之不然。 父類對象不是子類對象。 可以用關(guān)鍵字instanceof來判斷一個實(shí)例是否屬于某個類。 例: 簡單起見,本例中的類沒有任何成員。 class Person{ } public class Student extends Person{ public static void main(String args[]){ Person p=new Person(); Student s=new Student(); System.out.println(s instanceof Person); System.out.println(p instanceof Student); } } 其運(yùn)行結(jié)果如下: true false 因?yàn)?/span>p是Person的對象,s是Student的對象,而Student類繼承自Person類。故s也是Person的實(shí)例,而p卻不是Student的實(shí)例。 2、父類對象引用子類實(shí)例 子類對象也是父類對象,說明父類對象可以引用子類實(shí)例。但反過來不行。 例: class Person{ private String name; public Person(){ this.name="張熹熹"; } public void show(){ System.out.println("姓名:"+name); } } public class Student extends Person{ private String number; public Student(){ number="123";//默認(rèn)調(diào)用父類的Person() } public static void main(String args[]){ Person p=new Student(); p.show(); Student s=new Student(); s.show(); } } 其運(yùn)行結(jié)果為: 姓名:張熹熹 姓名:張熹熹 在main方法中,p中Person類的對象,但引用的是Student類的實(shí)例。S是Student類的對象,引用的也是Student類的實(shí)例。 3、編譯時多態(tài)和運(yùn)行時多態(tài) 根據(jù)何時能確定到底執(zhí)行的是多態(tài)中的哪一個方法,分為兩種情況:編譯時多態(tài)和運(yùn)行時多態(tài)。 如果在編譯時能夠確定執(zhí)行多態(tài)方法中的哪一下,就稱為編譯時多態(tài)。 否則,稱為運(yùn)行時多態(tài)。 方法的重載屬于編譯時多態(tài),因?yàn)樵诰幾g時,Java虛擬機(jī)已經(jīng)能夠根據(jù)參數(shù)類型和參數(shù)個數(shù)來匹配到底用的是哪一個重載的方法。 方法覆蓋有兩種多態(tài)性,如果創(chuàng)建的對象與引用的實(shí)例為同一個類,為編譯時多態(tài),如下: Student s=new Student(); 此時如果有s.show();在編譯時Java虛擬機(jī)就可以判定此show()方法為Student這個類的,如果Student中沒有這個方法,則沿著繼承的順序往上查找。 但如果創(chuàng)建的對象與引用的實(shí)例不為同一個類,為運(yùn)行時多態(tài)。 例:Person p=new Student(); p為Person類的對象,但引用的卻是Student類的實(shí)例。 若此時調(diào)用p.show(),那么這個show()方法是在Student類中的show()方法呢,還是Person類中的show()方法呢?這就是運(yùn)行時的多態(tài)。 程序運(yùn)行時,Java從實(shí)例所屬的類開始尋找匹配的方法執(zhí)行,如果當(dāng)前類中沒有匹配方法,則沿著繼承關(guān)系逐層向上,依次在父類或各祖先類中尋找匹配方法,直到Object類。 故上面代碼: Person p=newStudent(); p.show();//從實(shí)例所在的類Student開始尋找,如果Student類中有方法show(),則執(zhí)行;否則,沿著繼承關(guān)系向上,在Student類的父類Person中找,如果Person類中有方法show(),則執(zhí)行;否則,沿著繼承關(guān)系繼續(xù)向上,直到Object類為止。 4、多態(tài)的方法實(shí)現(xiàn) 以下例說明: class Person{ private String name; public Person(){ this.name="張熹熹"; } public String toString(){ return"姓名:"+name; } } public class Student extends Person{ private String number; public Student(){ number="123";//默認(rèn)調(diào)用父類的Person() } public String toString(){ super.toString(); return"學(xué)號:"+number; } public static void main(String args[]) { Person p=new Person(); System.out.println(p.toString());//編譯時多態(tài),因?yàn)?/span>p為Person類對象,引用的也是Person類的實(shí)例,故在編譯時便知是person類中的toString()方法 Persons=new Student();//父類對象引用子類實(shí)例 System.out.println(p.toString());//運(yùn)行時多態(tài),s為Person類對象,但引用的是Student類的實(shí)例,在運(yùn)行時,著先在實(shí)例所在的類Student中找toString()方法,有,即執(zhí)行。 } } 其運(yùn)行結(jié)果如下: 姓名:張熹熹 姓名:張熹熹 |
|