通過代碼實例深入解析Java重寫和重載
重載(Overloading)和重寫(Overriding)是Java中兩個比較重要的概念。但是對于新手來說也比較容易混淆。本文通過兩個簡單的例子說明了他們之間的區(qū)別。
定義
重載
簡單說,就是函數(shù)或者方法有同樣的名稱,但是參數(shù)列表不相同的情形,這樣的同名不同參數(shù)的函數(shù)或者方法之間,互相稱之為重載函數(shù)或者方法。
重寫
重寫指的是在Java的子類與父類中有兩個名稱、參數(shù)列表都相同的方法的情況。由于他們具有相同的方法簽名,所以子類中的新方法將覆蓋父類中原有的方法。
重載 VS 重寫
關(guān)于重載和重寫,你應(yīng)該知道以下幾點:
1、重載是一個編譯期概念、重寫是一個運行期間概念。
2、重載遵循所謂“編譯期綁定”,即在編譯時根據(jù)參數(shù)變量的類型判斷應(yīng)該調(diào)用哪個方法。
3、重寫遵循所謂“運行期綁定”,即在運行的時候,根據(jù)引用變量所指向的實際對象的類型來調(diào)用方法
4、因為在編譯期已經(jīng)確定調(diào)用哪個方法,所以重載并不是多態(tài)。而重寫是多態(tài)。重載只是一種語言特性,是一種語法規(guī)則,與多態(tài)無關(guān),與面向?qū)ο笠矡o關(guān)。(注:嚴格來說,重載是編譯時多態(tài),即靜態(tài)多態(tài)。但是,Java中提到的多態(tài),在不特別說明的情況下都指動態(tài)多態(tài))
重寫的例子
下面是一個重寫的例子,看完代碼之后不妨猜測一下輸出結(jié)果:
class Dog{ public void bark(){ System.out.println('woof '); }}class Hound extends Dog{ public void sniff(){ System.out.println('sniff '); } public void bark(){ System.out.println('bowl'); }}public class OverridingTest{ public static void main(String [] args){ Dog dog = new Hound(); dog.bark(); }}
輸出結(jié)果:
bowl
上面的例子中,dog對象被定義為Dog類型。在編譯期,編譯器會檢查Dog類中是否有可訪問的bark()方法,只要其中包含bark()方法,那么就可以編譯通過。在運行期,Hound對象被new出來,并賦值給dog變量,這時,JVM是明確的知道dog變量指向的其實是Hound對象的引用。所以,當dog調(diào)用bark()方法的時候,就會調(diào)用Hound類中定義的bark()方法。這就是所謂的動態(tài)多態(tài)性。
重寫的條件
參數(shù)列表必須完全與被重寫方法的相同;
返回類型必須完全與被重寫方法的返回類型相同;
訪問級別的限制性一定不能比被重寫方法的強;
訪問級別的限制性可以比被重寫方法的弱;
重寫方法一定不能拋出新的檢查異常或比被重寫的方法聲明的檢查異常更廣泛的檢查異常
重寫的方法能夠拋出更少或更有限的異常(也就是說,被重寫的方法聲明了異常,但重寫的方法可以什么也不聲明)
不能重寫被標示為final的方法;
如果不能繼承一個方法,則不能重寫這個方法。
重載的例子
class Dog{ public void bark(){ System.out.println('woof '); } //overloading method public void bark(int num){ for(int i=0; i<num; i++) System.out.println('woof '); }}
上面的代碼中,定義了兩個bark方法,一個是沒有參數(shù)的bark方法,另外一個是包含一個int類型參數(shù)的bark方法。在編譯期,編譯期可以根據(jù)方法簽名(方法名和參數(shù)情況)情況確定哪個方法被調(diào)用。
重載的條件
被重載的方法必須改變參數(shù)列表;
被重載的方法可以改變返回類型;
被重載的方法可以改變訪問修飾符;
被重載的方法可以聲明新的或更廣的檢查異常;
方法能夠在同一個類中或者在一個子類中被重載。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Java 3D的動畫展示(Part1-使用JMF)2. 解決docker與vmware的沖突問題3. IntelliJ Idea 2020.1 正式發(fā)布,官方支持中文(必看)4. Django ORM實現(xiàn)按天獲取數(shù)據(jù)去重求和例子5. Python基于jieba, wordcloud庫生成中文詞云6. Django中的AutoField字段使用7. IntelliJ IDEA設(shè)置自動提示功能快捷鍵的方法8. asp.net core應(yīng)用docke部署到centos7的全過程9. java使用FFmpeg合成視頻和音頻并獲取視頻中的音頻等操作(實例代碼詳解)10. PHP設(shè)計模式之 策略模式Strategy詳解【對象行為型】
