?? 首先來(lái)看概念區(qū)分:
重寫(xiě)是子類對(duì)父類的允許訪問(wèn)方法過(guò)程實(shí)現(xiàn)重新的編寫(xiě),返回值和形參都不變。
重載是在一個(gè)類里面方法名字相同,而參數(shù)不同。返回值的類型可以是相同的也可以是不同的。
多態(tài)是同一個(gè)行為具有多個(gè)不同的表現(xiàn)形式或形態(tài)的能力。
深入解析:
重寫(xiě):重寫(xiě)也叫做覆蓋,是指父類與子類之間的關(guān)系。在子類繼承父類的過(guò)程中,如果子類的方法名如父類的方法名是相同的,那么子類就不能繼承父類的方法,此時(shí),叫做子類重寫(xiě)或者覆蓋了父類的方法。通過(guò)重寫(xiě),可以使一個(gè)方法在不同的子類中表現(xiàn)出不同的行為。
如果子類沒(méi)有重寫(xiě)父類的方法,那么子類在使用該方法時(shí)還是用的父類的方法,并且可以直接調(diào)用。
Public class Animal{
void bark(){
*************
}
}
public class? Cat? extends Animal{
void? eat(){
&&&&&&&&&
}
}
pubic class Dog extends Animal{
void eat(){
$$$$$$$$$$4
}
}
main函數(shù)
Cat? cat=new Cat();
Dog dog=new Dog();
cat.bark();
cat.eat();
dog.eat();
輸出結(jié)果:**************
????????????????? &&&&&&&&
???????????????? $$$$$$$$$$
注意:在進(jìn)行方法的重寫(xiě)時(shí),子類不能夠覆蓋父類中聲明時(shí)final或者是static的方法。
????????? 子類的方法聲明要和父類的相同,在進(jìn)行重寫(xiě)的時(shí)候。
重載:調(diào)用方法時(shí)以 對(duì)象.方法(有無(wú)參數(shù))來(lái)調(diào)用方法。雖然方法的名字相同,但是調(diào)用的方法時(shí)不同的。每個(gè)被重載的方法必須有一個(gè)獨(dú)一無(wú)二的參數(shù)列表用來(lái)區(qū)分是用到了那個(gè)方法。在方法重載中,返回值的類型不能夠作為是否重載的標(biāo)志。如:void gets()和int gets()當(dāng)調(diào)用gets()這個(gè)方法時(shí),編譯器無(wú)法識(shí)別具體調(diào)用的是哪個(gè)方法。
多態(tài):多態(tài)是基于重寫(xiě)重載之上的,是JAVA的三大特性之一。
比如:
class? Shuben{
void?? function(){
************
}
class??? Yuwen? extends? Shuben{
void function(){
&&&&&&&&&&&&&&
}
void??? color(){
^^^^^^^^^^^^
}
main?
Shuben?? a=new Yuwen()
a.function();
a.color()://這段如果有,則報(bào)錯(cuò)。如果沒(méi)有繼續(xù)執(zhí)行出結(jié)果。
}
運(yùn)行結(jié)果:*************
注釋:在使用多態(tài)來(lái)調(diào)用方法時(shí),先檢查父類中有沒(méi)有該方法,如果沒(méi)有,則報(bào)錯(cuò),編譯不能繼續(xù)運(yùn)行。如果有,則再進(jìn)行調(diào)用對(duì)應(yīng)子類中的方法。如果父類中有該方法則直接調(diào)用,子類中沒(méi)有或者沒(méi)被重寫(xiě)則直接調(diào)用。
成員變量,多態(tài)后,還都是父類的數(shù)值。
成員方法多態(tài)后如果子類有重寫(xiě)該方法則是子類的數(shù)值,如果沒(méi)有或者沒(méi)有重寫(xiě)該方法,則是父類的數(shù)值。靜態(tài)方法調(diào)用后還都是父類的數(shù)值。