面向?qū)ο蟮奶卣魅?b>多態(tài)性
1搔耕、多態(tài)性指的是什么矮嫉?多態(tài)性,可以理解為一個(gè)事物的多種表現(xiàn)形態(tài)蚪拦。
1)方法的重載與重寫(xiě) ? ? ?2)子類(lèi)對(duì)象的多態(tài)性 ? ? ? ? ?
2杖剪、子類(lèi)對(duì)象使用多態(tài)性的前提:①要有繼承②要有子類(lèi)方法對(duì)父類(lèi)的重寫(xiě)③父類(lèi)的引用指向子類(lèi)的對(duì)象。
3驰贷、程序運(yùn)行分為編譯狀態(tài)和運(yùn)行狀態(tài)盛嘿。
對(duì)多態(tài)性來(lái)說(shuō),編譯時(shí)括袒,“看左邊”次兆,將此引用變量理解為父類(lèi)的類(lèi)型。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 運(yùn)行時(shí)锹锰,“看右面”芥炭,關(guān)注于真正對(duì)象的實(shí)體:子類(lèi)的對(duì)象。那么執(zhí)行的對(duì)象就是子類(lèi)的重寫(xiě)恃慧。
4园蝠、子類(lèi)方法的多態(tài)性,并不適用于屬性痢士。是根據(jù)左邊來(lái)確定的彪薛。 ?類(lèi)屬于重寫(xiě)或覆蓋,所以調(diào)用的時(shí)候是調(diào)用子類(lèi)的方法,而屬性沒(méi)有多態(tài)性陪汽,子類(lèi)和父類(lèi)同名的屬性會(huì)同時(shí)存在训唱,是調(diào)用左邊即父類(lèi)的屬性。
public static void main(String[] args) {
Person p = new Person();
p.eat();
p.walk();
Man m = new Man();
m.eat();
m.walk();
//子類(lèi)對(duì)象的多態(tài)性:父類(lèi)的引用指向子類(lèi)的對(duì)象挚冤。
Person p1 = new Man(); //向上轉(zhuǎn)型man-->person
//虛擬方法調(diào)用:通過(guò)父類(lèi)的引用指向子類(lèi)的對(duì)象實(shí)體,當(dāng)調(diào)用方法時(shí)赞庶,實(shí)際執(zhí)行的是子類(lèi)重寫(xiě)父的方法训挡。
p1.eat();//輸出的是子類(lèi)的信息
p1.walk();//輸出的是子類(lèi)的信息
p1.smoking();//錯(cuò)誤,因?yàn)镻erson類(lèi)中并沒(méi)有Man類(lèi)的方法歧强。
}
p1.smoking();//錯(cuò)誤澜薄,p1定義為person類(lèi),因?yàn)镻erson類(lèi)中并沒(méi)有Man類(lèi)的方法摊册,所以會(huì)出錯(cuò)肤京。但是如果person類(lèi)對(duì)象非要調(diào)用Man類(lèi)的方法的話,則需要向下轉(zhuǎn)型茅特,將p1向下轉(zhuǎn)型為Man類(lèi)忘分。
Man m = (Man) p1; ?//向下轉(zhuǎn)型 person類(lèi)-->man類(lèi)
m.smoking(); ?//正確運(yùn)行
基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)型:向下轉(zhuǎn)型 ?和 ?向上轉(zhuǎn)型
較高級(jí)的基本數(shù)據(jù)類(lèi)型---------->較低級(jí)的基本數(shù)據(jù)類(lèi)型(基本類(lèi)型轉(zhuǎn)換)
較低級(jí)的基本數(shù)據(jù)類(lèi)型---------->較高級(jí)的基本數(shù)據(jù)類(lèi)型(強(qiáng)制類(lèi)型轉(zhuǎn)換)
父類(lèi)(如Person)----->子類(lèi)(如Man),向下轉(zhuǎn)型白修,使用instanceof判斷妒峦,Man m = (Man) p1, p1原先屬于person類(lèi)兵睛,使用強(qiáng)轉(zhuǎn)符()
子類(lèi)(如Man)----->父類(lèi)(如Person)肯骇,向上轉(zhuǎn)型,Person ?p1 = new Man();
注:但是要把一個(gè)Man強(qiáng)制類(lèi)型轉(zhuǎn)換成一個(gè)Woman類(lèi)型祖很,編譯時(shí)并不會(huì)報(bào)錯(cuò)笛丙,但是運(yùn)行時(shí)會(huì)報(bào)錯(cuò),類(lèi)型轉(zhuǎn)換錯(cuò)誤(java.lang.ClassCastException)假颇。
instanceof:
格式:對(duì)象a ?instanceof 類(lèi)A胚鸯,判斷對(duì)象a是否屬于類(lèi)A的一個(gè)實(shí)例,若是拆融,則返回true蠢琳,否則返回false。 ? ?若對(duì)象a是A類(lèi)的一個(gè)實(shí)例镜豹,那么也一定是A類(lèi)的父類(lèi)的實(shí)例傲须。
if(p1 instanceof Woman){
Woman w1 =(Woman) p1;
w1.shopping();}
if(p1 instanceof Man){
Man m1 =(Man) p1;
m1.smoking();}