面向?qū)ο蟮娜筇攸c(diǎn)是封裝钮惠、繼承、多態(tài)七芭,其中extends類和implements接口是多態(tài)的基礎(chǔ)素挽,所謂多態(tài),是對(duì)一個(gè)對(duì)象而言的狸驳,例如有一個(gè)父類叫動(dòng)物预明,子類叫狗缩赛,那么我創(chuàng)建一個(gè)對(duì)象“Dog juanjuan = new Dog()”時(shí),juanjuan這個(gè)對(duì)象既是狗也是一個(gè)動(dòng)物撰糠,怎么叫都沒有問題酥馍。多態(tài)還有一種常用寫法即“父類名稱 對(duì)象名 = new 子類名稱()”,那么這樣寫有什么需要注意的呢阅酪?
//父類
public class Father{
int age = 50;
public void eat(){
sout("父親喜歡吃花生")旨袒;
}
public void earn(){
sout("父親掙錢");
}
}
//子類
public class Son extends Father{
int age = 26;
@Override
public void eat(){
sout("兒子喜歡吃肉");
}
public void study(){
sout("兒子學(xué)習(xí)");
}
}
public class Main{
psvm{
Father jack = new Son();
sout(jack.age); //50
jack.eat(); //兒子喜歡吃肉
jack.earn(); //父親掙錢
jack.study(); //找不到該方法术辐,編譯錯(cuò)誤
}
}
我們?cè)趧?chuàng)建對(duì)象的時(shí)候就看這個(gè)對(duì)象是什么類型的峦失,比如Jack是Father類型的,那么它擁有Father的全部成員變量和成員方法术吗,因?yàn)槌蓡T變量是不能重載的尉辑,所以jack.age會(huì)輸出50;那么new Son()有什么作用呢较屿?那就是如果方法進(jìn)行了重載隧魄,那么就會(huì)優(yōu)先執(zhí)行重載的方法。
個(gè)人理解如下隘蝎,如有錯(cuò)誤购啄,萬分抱歉!
個(gè)人理解是嘱么,在創(chuàng)建Father類型的對(duì)象狮含,但右邊new了一個(gè)子類的時(shí)候,由于成員變量無法重載曼振,所以直接將Father類中的成員變量照搬過來即可几迄,但是對(duì)成員方法要在Son()中進(jìn)行檢查,如有同名重寫的方法冰评,就用Son()中的方法映胁,其它的方法直接照搬Father類中的方法。
所以關(guān)鍵是看這個(gè)對(duì)象是什么類型的甲雅,要記住jack是Father類型的解孙,但是new Son()就是對(duì)一些重名函數(shù)進(jìn)行重寫。
個(gè)人理解這樣的做法是抛人,比如我創(chuàng)建了某個(gè)用戶弛姜,我就想把他當(dāng)做User來看,User xiezhao妖枚,但是在某些權(quán)限方面廷臼,可能是VIP或者不是VIP,User xiezhao = new Vip();/User xiezhao = new NonVip();首先我肯定是用戶,但對(duì)于是不是VIP中剩,我有不同的權(quán)限忌穿,這樣就可以很統(tǒng)一的把一些成員當(dāng)做User用戶來看,而不是細(xì)分到是不是VIP结啼。換言之掠剑,在代碼層面來看,我可以把左邊進(jìn)行統(tǒng)一郊愧,而右邊表示的是我所關(guān)注的點(diǎn)朴译,如下所示
//不使用多態(tài)
Vip1 a1 = new vip1();
Vip2 a2 = new vip2();
Vip1 a3 = new vip1();
Vip1 a4 = new vip1();
Vip3 a5 = new vip3();
//使用多態(tài)
User a1 = new vip1();
User a2 = new vip2();
User a3 = new vip1();
User a4 = new vip1();
User a5 = new vip3();
看出來了嗎,我并不關(guān)心其它的東西属铁,我只關(guān)心你是Vip幾眠寿,反正你是我的用戶就完事兒了,代碼左邊直接統(tǒng)一起來了焦蘑,巴適盯拱!
總結(jié)下來就是,我等號(hào)左邊是什么類型例嘱,就把這個(gè)對(duì)象當(dāng)做是什么類型的來看狡逢,但是跟普通的實(shí)例化有一點(diǎn)區(qū)別就是,如果在子類中有父類同名方法進(jìn)行了重載拼卵,那么我用的這個(gè)同名方法就要變更為子類中的方法奢浑,其它的一切一切都不變!