重载与重写(overload and override)
在java編程中經(jīng)常會遇到重載和重寫,剛接觸java的時候?qū)@對概念比較懵比,也不能理解其中的區(qū)別,后來在逐漸的學(xué)習(xí)中更加深刻的理解了其中的原理。哎,說來還是基礎(chǔ)知識學(xué)的不扎實,這些都是大學(xué)期間偷懶欠下的帳。
(一)簡單理解
1.重載是在一個類中有多個名稱一樣的方法,需要根據(jù)參數(shù)來辨識運(yùn)行時使用哪個方法。在java中同一個類的同名方法的重載僅依賴(1)參數(shù)類型、(2)參數(shù)個數(shù)、(3)參數(shù)順序三者決定。與返回類型,函數(shù)修飾符都無關(guān)。
2.重寫是多個類繼承于同一父類,并同時實現(xiàn)了父類的方法,這時我們在利用父類上轉(zhuǎn)型引用子類并調(diào)用接口時,jvm會幫我們執(zhí)行子類實現(xiàn)的方法邏輯。舉個栗子如下:
class Animal{public void move(){System.out.println("動物可以移動");} }class Dog extends Animal{public void move(){System.out.println("狗可以跑和走");} }public class TestDog{public static void main(String args[]){Animal a = new Animal(); // Animal 對象Animal b = new Dog(); // Dog 對象a.move();// 執(zhí)行 Animal 類的方法b.move();//執(zhí)行 Dog 類的方法} }(二)深入理解
java代碼在經(jīng)過javac編譯后成為class文件,然后會通過類加載器加載進(jìn)入內(nèi)存。加載類文件的過程是由虛擬機(jī)外部用戶自定義的類裝載器實現(xiàn)的,我們常用的就是tomcat,tomcat會將class類文件裝載進(jìn)內(nèi)存,然后由虛擬機(jī)進(jìn)行驗證、準(zhǔn)備、解析、初始化等操作。class文件中包含邏輯代碼生成的字節(jié)碼及很多常量池引用組成的元數(shù)據(jù)。我們在進(jìn)行方法調(diào)用時,實際上目標(biāo)方法在class文件中就是一個對常量池的符號引用。們需要將這個符號引用轉(zhuǎn)為直接引用,這個過程是jvm在解析過程中實現(xiàn)的。我們的重載和重寫就是從解析開始的,接下來我們仔細(xì)介紹類的解析及方法的分派過程。
(1)方法調(diào)用的解析過程
我們代碼中對外部類方法的調(diào)用,一開始都是簡單的符號引用,虛擬機(jī)在類加載階段會自動幫我們進(jìn)行對符號引用的解析。這個過程可能在類加載期進(jìn)行,也可能在運(yùn)行時進(jìn)行,主要是為了實現(xiàn)java的動態(tài)分派,這個之后說。類加載階段的解析只能針對類的靜態(tài)方法、私有方法和final方法進(jìn)行,因為這些方法在運(yùn)行期都是不會發(fā)生變化的,其他類型的方法可能被子類繼承并重寫,我們無法在類加載時就確定其直接引用。
(2)方法的分派
方法的分派包含靜態(tài)分派和動態(tài)分派,重載出現(xiàn)在靜態(tài)分派的過程中,而重寫出現(xiàn)在動態(tài)分派的過程中。
1.當(dāng)我們的方法調(diào)用在解析過程中找到對應(yīng)的類后,發(fā)現(xiàn)對應(yīng)的類中有很多同名的方法,這時會根據(jù)方法調(diào)用時使用的參數(shù)類型(稱為靜態(tài)類型)來判定使用哪個函數(shù),然后將依賴類進(jìn)行加載和初始化,并將符號引用轉(zhuǎn)為這個類方法的內(nèi)存地址,這個過程就叫做靜態(tài)分派。
2.當(dāng)程序運(yùn)行后,在方法調(diào)用的解析過程中發(fā)現(xiàn)代碼聲明的類和運(yùn)行時引用類不同時,會根據(jù)實際引用類的地址去尋找實際引用類的方法列表中尋找是否有相應(yīng)方法,這個過程叫做動態(tài)分派,例如有個Son類繼承了父類Father類,并實現(xiàn)了父類的run方法,然后我們執(zhí)行 Father sonRun = new Son(); sonRun.run();這個過程便是動態(tài)分派的過程,動態(tài)分派只能在運(yùn)行期,不能根據(jù)靜態(tài)類型(Father類)確定方法的內(nèi)存地址,只能在在操作數(shù)棧中找到實際類型。
總結(jié)
以上是生活随笔為你收集整理的重载与重写(overload and override)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java类内部的变量
- 下一篇: 如何判断软件架构的好与坏