java+編譯器+代碼 Java常用編譯器

Java編譯器如何生成重載和覆蓋方法代碼

舉個(gè)簡(jiǎn)單的例子,展示了多態(tài)性(Polymorphism):重載(Overloaded)和覆蓋(Overridden)。

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有萬(wàn)柏林免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

多態(tài)性意味著方法可以在不同的時(shí)刻表現(xiàn)出不同的形式。在編譯期間,這被稱為方法重載。重載允許相關(guān)的方法可以使用相同的方法名訪問(wèn)。有時(shí)候這被稱為ad hoc polymorphism,與parametric polymorphism 不同。

輸出:

intstringoverriden int

從編譯器的角度講,如何生成能夠正確調(diào)用的函數(shù)的代碼?

靜態(tài)重載(Static overloading)不難實(shí)現(xiàn)。當(dāng)處理一個(gè)重載方法的聲明時(shí),一個(gè)新的綁定會(huì)被映射到一個(gè)不同的實(shí)現(xiàn)。在處理類型檢查的過(guò)程中,編譯器會(huì)分析參數(shù)的實(shí)際類型,然后決定使用哪個(gè)方法。

動(dòng)態(tài)重載(Dynamic overloading )允許運(yùn)行時(shí)根據(jù)實(shí)際參數(shù)的類型來(lái)選擇函數(shù)的不同實(shí)現(xiàn)。這是動(dòng)態(tài)調(diào)度(dynamic dispatch)的一種形式。

動(dòng)態(tài)調(diào)度也被用來(lái)實(shí)現(xiàn)方法覆蓋。被覆蓋的方法的調(diào)用由運(yùn)行期間實(shí)際對(duì)象的類型決定的。

javac是什么?

javac是Java編譯器,負(fù)責(zé)將Java源代碼轉(zhuǎn)換成字節(jié)碼文件。

javac 可以隱式編譯一些沒(méi)有在命令行中提及的源文件。用 -verbose 選項(xiàng)可跟蹤自動(dòng)編譯。當(dāng)編譯源文件時(shí),編譯器常常需要它還沒(méi)有識(shí)別出的類型的有關(guān)信息。

javac的特點(diǎn)

javac具有簡(jiǎn)單性、面向?qū)ο?、分布性、解釋性、可靠、安全、平臺(tái)無(wú)關(guān)、可移植性、高性能、多線程、動(dòng)態(tài)性等特點(diǎn)。提供了異常處理機(jī)制,程序員可以把錯(cuò)誤代碼放在一起,這樣可以簡(jiǎn)化錯(cuò)誤處理任務(wù),便于恢復(fù)。不支持指針,杜絕了內(nèi)存的非法訪問(wèn)。

java編譯器的代碼優(yōu)化問(wèn)題

理論上的就不說(shuō)了,你自己搜也能搜到很多。

舉個(gè)例子,你從一個(gè)方法a調(diào)用了另一個(gè)方法b。

我們知道,在a和b之中是可以創(chuàng)建相同名稱的變量的,比如都有int i = 0;這句話。這種現(xiàn)象的根本原因在于,方法的調(diào)用會(huì)產(chǎn)生中斷,中斷產(chǎn)生后,cpu會(huì)做現(xiàn)場(chǎng)保護(hù),包括把變量等進(jìn)行壓棧操作,即把方法a的相關(guān)資源進(jìn)行了壓棧,而方法b的相關(guān)資源放在棧頂,只有棧頂資源可以與cpu交互(就把方法a中的變量i保護(hù)起來(lái)),當(dāng)方法b結(jié)束后出棧,a就又回到了棧頂,并獲取了方法b運(yùn)行的結(jié)果,然后繼續(xù)運(yùn)行。

哎,有些啰嗦了。方法的調(diào)用、中斷、壓棧出棧等等這些操作你說(shuō)一點(diǎn)不消耗資源吧,那是不可能的,多少都會(huì)消耗一些,雖然很非常十分微不足道。那么編譯器的優(yōu)化過(guò)程,我知道的其作用之一,就是會(huì)把這些做一個(gè)優(yōu)化。原本方法a一共10句話,你偏要只寫(xiě)1句,然后第2句寫(xiě)成方法b,第3句寫(xiě)成方法c。。。。。,然后依次嵌套調(diào)用。這樣的源代碼,編譯器優(yōu)化后,就跟你直接寫(xiě)10句是一個(gè)結(jié)果,即做了一定程度上的優(yōu)化。

簡(jiǎn)述JAVA程序的編輯編譯和運(yùn)行過(guò)程

第一步(編譯): 創(chuàng)建完源文件之后,程序會(huì)先被編譯為.class文件。Java編譯一個(gè)類時(shí),如果這個(gè)類所依賴的類還沒(méi)有被編譯,編譯器就會(huì)先編譯這個(gè)被依賴的類,然后引用,否則直接引用,這個(gè)有點(diǎn)象make。

如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報(bào)“cant find symbol”的錯(cuò)誤。

第二步(運(yùn)行):java類運(yùn)行的過(guò)程大概可分為兩個(gè)過(guò)程:1、類的加載 2、類的執(zhí)行。需要說(shuō)明的是:JVM主要在程序第一次主動(dòng)使用類的時(shí)候,才會(huì)去加載該類。也就是說(shuō),JVM并不是在一開(kāi)始就把一個(gè)程序就所有的類都加載到內(nèi)存中,而是到不得不用的時(shí)候才把它加載進(jìn)來(lái),而且只加載一次。

特別說(shuō)明:java類中所有public和protected的實(shí)例方法都采用動(dòng)態(tài)綁定機(jī)制,所有私有方法、靜態(tài)方法、構(gòu)造器及初始化方法clinit都是采用靜態(tài)綁定機(jī)制。而使用動(dòng)態(tài)綁定機(jī)制的時(shí)候會(huì)用到方法表,靜態(tài)綁定時(shí)并不會(huì)用到。

擴(kuò)展資料:

Java整個(gè)編譯以及運(yùn)行的過(guò)程相當(dāng)繁瑣,本文通過(guò)一個(gè)簡(jiǎn)單的程序來(lái)簡(jiǎn)單的說(shuō)明整個(gè)流程。

Java代碼編譯:是由Java源碼編譯器來(lái)完成;

Java字節(jié)碼的執(zhí)行:是由JVM執(zhí)行引擎來(lái)完成

Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過(guò)兩大步驟:

1、源文件由編譯器編譯成字節(jié)碼(ByteCode)

2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行。因?yàn)閖ava程序既要編譯同時(shí)也要經(jīng)過(guò)JVM的解釋運(yùn)行,所以說(shuō)Java被稱為半解釋語(yǔ)言( "semi-interpreted" language)。

本文題目:java+編譯器+代碼 Java常用編譯器
當(dāng)前網(wǎng)址:http://muchs.cn/article36/docoepg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、云服務(wù)器響應(yīng)式網(wǎng)站、企業(yè)建站、虛擬主機(jī)、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)