一、概念
Java中的重寫是指子類重新編寫父類中對子類可視的方法邏輯,但是方法的形參和返回類型不變,方法的訪問修飾符不能嚴於父類的,即外殼不變、核心重寫。
在一個類中,只要滿足方法名相同,參數個數或者類型不同,即為方法重載,它與方法的返回類型和訪問修飾符沒有關系。
二、條件(規則)
方法重寫的規則:
1、方法的名字、參數列表和返回類型一定要和父類一樣,不能被修改;
2、方法的訪問修飾符不能嚴於父類的,但可以降低限制(比如父類的方法的訪問修飾符是protected,那么子類重寫的話訪問修飾符只能是protected或者public);
3、子類重寫的方法一定不能拋出新的檢查異常或者拋出比父類更寬泛的檢查異常(只能拋出父類原來的異常或者原來異常的子類異常),但是可以拋出非檢查異常;
4、父類中static、final以及private修飾的方法,子類不能重寫,因為它們都屬於靜態綁定的,在編譯時虛擬機就已經確定了方法所對應的具體對象,即父類;
5、父類的構造方法子類不能重寫;
6、對於父類的包訪問權限的方法(default),如果子類和父類在同一個包中,則子類可以重寫這些方法,如果二者不在同一個包中,則不能重寫。
方法重載的規則:
1、方法名一定要相同,方法的參數個數或者參數類型一定要不同;
2、方法的返回值和訪問修飾符可以不同,這並不是判斷方法重載的條件;
3、方法的拋出異常可以不同;
4、重載是發生在一個類中的,不同類中不存在方法重載;
5、final修飾的方法可以重載。
三、二者的區別
1、方法重寫發生於父類和子類之間,而方法重載發生在一個類中;
2、方法重寫要求方法名、參數列表、返回值一定要相同,且不能拋出新的檢查異常或者拋出比父類更寬泛的檢查異常;而方法重載只要求方法名相同,參數個數或者類型不同,對於其他的並沒有要求;
3、子類不能重寫父類中final、static、private修飾的方法以及父類的構造方法;而上面所說的所有方法都可以在一個類中被重載;
4、重寫是父類與子類之間多態的體現,它屬於運行時的多態;而方法重載是讓類以統一的方式處理不同類型數據的一種手段,多個同名函數同時存在,具有不同的參數個數/類型,通過傳遞的參數個數和類
型來決定調用哪一個方法,這就是多態性的一種表現,即編譯時的多態;
5、運行時的多態是指在運行的時候,通過判斷方法所對應的具體對象\類型,從而調用具體的方法,這就是多態性;而編譯時的多態,指的是通過參數的個數或者類型就可以確定調用哪個方法,當然,它只
發生在一個類中,這就是方法重載,它也是多態的體現。
四、總結
方法重載使得Java類中的代碼變得更加簡潔,相同的方法名通過不同的參數個數或者類型就可以實現不同的效果;而重載則可以讓子類根據自己的特殊需求重新編寫屬於自己的代碼,這正是多態性。應用好
重載和重寫將能幫助我們設計出更加清晰簡潔的Java類以及更加健壯的Java代碼。