舉個(gè)簡單的例子,展示了多態(tài)性(Polymorphism):重載(Overloaded)和覆蓋(Overridden)。
10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有萬柏林免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
多態(tài)性意味著方法可以在不同的時(shí)刻表現(xiàn)出不同的形式。在編譯期間,這被稱為方法重載。重載允許相關(guān)的方法可以使用相同的方法名訪問。有時(shí)候這被稱為ad hoc polymorphism,與parametric polymorphism 不同。
輸出:
intstringoverriden int
從編譯器的角度講,如何生成能夠正確調(diào)用的函數(shù)的代碼?
靜態(tài)重載(Static overloading)不難實(shí)現(xiàn)。當(dāng)處理一個(gè)重載方法的聲明時(shí),一個(gè)新的綁定會被映射到一個(gè)不同的實(shí)現(xiàn)。在處理類型檢查的過程中,編譯器會分析參數(shù)的實(shí)際類型,然后決定使用哪個(gè)方法。
動態(tài)重載(Dynamic overloading )允許運(yùn)行時(shí)根據(jù)實(shí)際參數(shù)的類型來選擇函數(shù)的不同實(shí)現(xiàn)。這是動態(tài)調(diào)度(dynamic dispatch)的一種形式。
動態(tài)調(diào)度也被用來實(shí)現(xiàn)方法覆蓋。被覆蓋的方法的調(diào)用由運(yùn)行期間實(shí)際對象的類型決定的。
javac是Java編譯器,負(fù)責(zé)將Java源代碼轉(zhuǎn)換成字節(jié)碼文件。
javac 可以隱式編譯一些沒有在命令行中提及的源文件。用 -verbose 選項(xiàng)可跟蹤自動編譯。當(dāng)編譯源文件時(shí),編譯器常常需要它還沒有識別出的類型的有關(guān)信息。
javac的特點(diǎn)
javac具有簡單性、面向?qū)ο?、分布性、解釋性、可靠、安全、平臺無關(guān)、可移植性、高性能、多線程、動態(tài)性等特點(diǎn)。提供了異常處理機(jī)制,程序員可以把錯(cuò)誤代碼放在一起,這樣可以簡化錯(cuò)誤處理任務(wù),便于恢復(fù)。不支持指針,杜絕了內(nèi)存的非法訪問。
理論上的就不說了,你自己搜也能搜到很多。
舉個(gè)例子,你從一個(gè)方法a調(diào)用了另一個(gè)方法b。
我們知道,在a和b之中是可以創(chuàng)建相同名稱的變量的,比如都有int i = 0;這句話。這種現(xiàn)象的根本原因在于,方法的調(diào)用會產(chǎn)生中斷,中斷產(chǎn)生后,cpu會做現(xiàn)場保護(hù),包括把變量等進(jìn)行壓棧操作,即把方法a的相關(guān)資源進(jìn)行了壓棧,而方法b的相關(guān)資源放在棧頂,只有棧頂資源可以與cpu交互(就把方法a中的變量i保護(hù)起來),當(dāng)方法b結(jié)束后出棧,a就又回到了棧頂,并獲取了方法b運(yùn)行的結(jié)果,然后繼續(xù)運(yùn)行。
哎,有些啰嗦了。方法的調(diào)用、中斷、壓棧出棧等等這些操作你說一點(diǎn)不消耗資源吧,那是不可能的,多少都會消耗一些,雖然很非常十分微不足道。那么編譯器的優(yōu)化過程,我知道的其作用之一,就是會把這些做一個(gè)優(yōu)化。原本方法a一共10句話,你偏要只寫1句,然后第2句寫成方法b,第3句寫成方法c。。。。。,然后依次嵌套調(diào)用。這樣的源代碼,編譯器優(yōu)化后,就跟你直接寫10句是一個(gè)結(jié)果,即做了一定程度上的優(yōu)化。
第一步(編譯): 創(chuàng)建完源文件之后,程序會先被編譯為.class文件。Java編譯一個(gè)類時(shí),如果這個(gè)類所依賴的類還沒有被編譯,編譯器就會先編譯這個(gè)被依賴的類,然后引用,否則直接引用,這個(gè)有點(diǎn)象make。
如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報(bào)“cant find symbol”的錯(cuò)誤。
第二步(運(yùn)行):java類運(yùn)行的過程大概可分為兩個(gè)過程:1、類的加載 2、類的執(zhí)行。需要說明的是:JVM主要在程序第一次主動使用類的時(shí)候,才會去加載該類。也就是說,JVM并不是在一開始就把一個(gè)程序就所有的類都加載到內(nèi)存中,而是到不得不用的時(shí)候才把它加載進(jìn)來,而且只加載一次。
特別說明:java類中所有public和protected的實(shí)例方法都采用動態(tài)綁定機(jī)制,所有私有方法、靜態(tài)方法、構(gòu)造器及初始化方法clinit都是采用靜態(tài)綁定機(jī)制。而使用動態(tài)綁定機(jī)制的時(shí)候會用到方法表,靜態(tài)綁定時(shí)并不會用到。
擴(kuò)展資料:
Java整個(gè)編譯以及運(yùn)行的過程相當(dāng)繁瑣,本文通過一個(gè)簡單的程序來簡單的說明整個(gè)流程。
Java代碼編譯:是由Java源碼編譯器來完成;
Java字節(jié)碼的執(zhí)行:是由JVM執(zhí)行引擎來完成
Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過兩大步驟:
1、源文件由編譯器編譯成字節(jié)碼(ByteCode)
2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行。因?yàn)閖ava程序既要編譯同時(shí)也要經(jīng)過JVM的解釋運(yùn)行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。