版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——Java面試題問(wèn)答之編譯時(shí)與運(yùn)行時(shí)Java面試題問(wèn)答之編譯時(shí)與運(yùn)行時(shí)
在開(kāi)發(fā)和設(shè)計(jì)的時(shí)候,我們需要考慮編譯時(shí),運(yùn)行時(shí)以及構(gòu)建時(shí)這三個(gè)概念。下面是我為大家探尋整理的關(guān)于常見(jiàn)的Java問(wèn)題與解答,接待參考閱讀,夢(mèng)想對(duì)大家有所扶助!想了解更多相關(guān)信息請(qǐng)持續(xù)關(guān)注我們我!
Q.下面的代碼片段中,行A和行B所標(biāo)識(shí)的代碼有什么識(shí)別呢?
publicclassConstantFolding
staticfinalintnumber1=5;
staticfinalintnumber2=6;
staticintnumber3=5;
staticintnumber4=6;
publicstaticvoidmainString[]args
intproduct1=number1*number2;//lineA
intproduct2=number3*number4;//lineB
A.在行A的代碼中,product的值是在編譯期計(jì)算的,行B那么是在運(yùn)行時(shí)計(jì)算的。
假設(shè)你使用Java反編譯器例如,jd-gui來(lái)反編譯ConstantFolding.class文件的話(huà),那么你就會(huì)從下面的結(jié)果里得到答案。
publicclassConstantFolding
staticfinalintnumber1=5;
staticfinalintnumber2=6;
staticintnumber3=5;
staticintnumber4=6;
publicstaticvoidmainString[]args
intproduct1=30;
intproduct2=number3*number4;
常量折疊是一種Java編譯器使用的優(yōu)化技術(shù)。由于final變量的值不會(huì)變更,因此就可以對(duì)它們優(yōu)化。Java反編譯器和javap命令都是查看編譯后的代碼例如,字節(jié)碼的利器。
Q.你能想出除了代碼優(yōu)化外,在什么處境下,查看編譯過(guò)的代碼是很有扶助的?
A.Java里的泛型是在編譯時(shí)構(gòu)造的,可以通過(guò)查看編譯后的class文件來(lái)理解泛型,也可以通過(guò)查看它來(lái)解決泛型相關(guān)的問(wèn)題。
Q.下面哪些是發(fā)生在編譯時(shí),運(yùn)行時(shí),或者兩者都有?
A.
方法重載:這個(gè)是發(fā)生在編譯時(shí)的。方法重載也被稱(chēng)為編譯時(shí)多態(tài),由于編譯器可以根據(jù)參數(shù)的類(lèi)型來(lái)選擇使用哪個(gè)方法。
publicclass
publicstaticvoidevaluateStringparam1;//method#1
publicstaticvoidevaluateintparam1;//method#2
假設(shè)編譯器要編譯下面的語(yǔ)句的話(huà):
evaluate“MyTestArgumentpassedtoparam1”;
它會(huì)根據(jù)傳入的參數(shù)是字符串常量,生成調(diào)用#1方法的字節(jié)碼
方法籠罩:這個(gè)是在運(yùn)行時(shí)發(fā)生的。方法籠罩被稱(chēng)為運(yùn)行時(shí)多態(tài),由于在編譯期編譯器不知道并且沒(méi)法知道該去調(diào)用哪個(gè)方法。JVM會(huì)在代碼運(yùn)行的時(shí)候做出抉擇。
publicclassA
publicintcomputeintinput//method#3
return3*input;
publicclassBextendsA
@Override
publicintcomputeintinput//method#4
return4*input;
子類(lèi)B中的compute..方法重寫(xiě)了父類(lèi)的compute..方法。假設(shè)編譯器遇到下面的代碼:
publicintevaluateAreference,intarg2
intresult=putearg2;
編譯器是沒(méi)法知道傳入的參數(shù)reference的類(lèi)型是A還是B。因此,只能夠在運(yùn)行時(shí),根據(jù)賦給輸入變量“reference”的對(duì)象的類(lèi)型例如,A或者B的實(shí)例來(lái)抉擇調(diào)用方法#3還是方法#4.
泛型又稱(chēng)類(lèi)型檢驗(yàn):這個(gè)是發(fā)生在編譯期的。編譯器負(fù)責(zé)檢查程序中類(lèi)型的正確性,然后把使用了泛型的代碼翻譯或者重寫(xiě)成可以執(zhí)行在當(dāng)前JVM上的非泛型代碼。這個(gè)技術(shù)被稱(chēng)為“類(lèi)型擦除“。換句話(huà)來(lái)說(shuō),編譯器會(huì)擦除全體在尖括號(hào)里的類(lèi)型信息,來(lái)保證和版本1.4.0或者更早版本的JRE的兼容性。
ListmyList=newArrayList10;
編譯后成為了:
ListmyList=newArrayList10;
注解Annotation:你可以使用運(yùn)行時(shí)或者編譯時(shí)的注解。
publicclassBextendsA
@Override
publicintcomputeintinput//method#4
return4*input;
Java面試題問(wèn)答之編譯時(shí)與運(yùn)行時(shí)
@Override是一個(gè)簡(jiǎn)樸的編譯時(shí)注解,它可以用來(lái)捕獲類(lèi)似于在子類(lèi)中把toString寫(xiě)成tostring這樣的錯(cuò)誤。在Java5中,用戶(hù)自定義的注解可以用注解處理工具AnotationProcessTool——APT在編譯時(shí)舉行處理。到了Java6,這個(gè)功能已經(jīng)是編譯器的一片面了。
publicclassMyTest
@Test
publicvoidtestEmptyness
org.junit.Assert.assertTruegetList.isEmpty;
privateListgetList
//implemenationgoeshere
@Test是JUnit框架用來(lái)在運(yùn)行時(shí)通過(guò)反射來(lái)抉擇調(diào)用測(cè)試類(lèi)的哪個(gè)些方法的注解。
@Testtimeout=100
publicvoidtestTimeout
whiletrue;//infiniteloop
假設(shè)運(yùn)行時(shí)間超過(guò)100ms的話(huà),上面的測(cè)試用例就會(huì)失敗。
@Testexpected=IndexOutOfBoundsException.class
publicvoidtestOutOfBounds
newArrayList.get1;
假設(shè)上面的代碼在運(yùn)行時(shí)沒(méi)有拋出IndexOutOfBoundsException或者拋出的是其他的奇怪的話(huà),那么這個(gè)用例就會(huì)失敗。用戶(hù)自定義的注解可以在運(yùn)行時(shí)通過(guò)Java反射API里新增的AnnotatedElement和”Annotation”元素接口來(lái)處理。
奇怪Exception:你可以使用運(yùn)行時(shí)奇怪或者編譯時(shí)奇怪。
運(yùn)行時(shí)奇怪RuntimeException也稱(chēng)作未檢測(cè)的奇怪uncheckedexception,這表示這種奇怪不需要編譯器來(lái)檢測(cè)。RuntimeException是全體可以在運(yùn)行時(shí)拋出的奇怪的父類(lèi)。一個(gè)方法除要捕獲奇怪外,假設(shè)它執(zhí)行的時(shí)候可能會(huì)拋出RuntimeException的子類(lèi),那么它就不需要用throw語(yǔ)句來(lái)聲明拋出的奇怪。
例如:NullPointerException,ArrayIndexOutOfBoundsException,等等
受檢查奇怪checkedexception都是編譯器在編譯時(shí)舉行校驗(yàn)的,通過(guò)throws語(yǔ)句或者trycathch語(yǔ)句塊來(lái)處理檢測(cè)奇怪。編譯器會(huì)分析哪些奇怪會(huì)在執(zhí)行一個(gè)方法或者構(gòu)造函數(shù)的時(shí)候拋出。
面向切面的編程AspectOrientedProgramming-AOP:切面可以在編譯時(shí),運(yùn)行時(shí)或,加載時(shí)或者運(yùn)行時(shí)織入。PS:這點(diǎn)需要了解Spring等框架才明白哦
編譯期:編譯期織入是最簡(jiǎn)樸的方式。假設(shè)你擁有應(yīng)用的代碼,你可以使用AOP編譯器例如,ajc–AspectJ編譯器對(duì)源碼舉行編譯,然后輸出織入完成的class文件。AOP編譯的過(guò)程包含了waver的調(diào)用。切面的形式可以是源碼的形式也可以是二進(jìn)制的形式。假設(shè)切面需要針對(duì)受影響的類(lèi)舉行編譯,那么你就需要在編譯期織入了。
編譯后:這種方式有時(shí)候也被稱(chēng)為二進(jìn)制織入,它被用來(lái)織入已有的class文件和jar文件。和編譯時(shí)織入方式一致,用來(lái)織入的切面可以是源碼也可以是二進(jìn)制的形式,并且它們自己也可以被織入切面。
裝載期:這種織入是一種二進(jìn)制織入,它被延遲到JVM加載class文件和定義類(lèi)的'時(shí)候。為了支持這種織入方式,需要顯式地由運(yùn)行時(shí)環(huán)境或者通過(guò)一種“織入代理weavingagent“來(lái)供給一個(gè)或者多個(gè)“織入類(lèi)加載器weavingclassloader”。
運(yùn)行時(shí):對(duì)已經(jīng)加載到JVM里的類(lèi)舉行織入
繼承–發(fā)生在編譯時(shí),由于它是靜態(tài)的
代理或者組合–發(fā)生在運(yùn)行時(shí),由于它更加具有動(dòng)態(tài)性和生動(dòng)性。
Q.你有沒(méi)有聽(tīng)說(shuō)過(guò)“組合優(yōu)于繼承”這樣的說(shuō)法呢?假設(shè)聽(tīng)說(shuō)過(guò)的話(huà),那么你是怎么理解的呢?
A.繼承是一種多態(tài)工具,而不是一種代碼復(fù)用工具。有些開(kāi)發(fā)者熱愛(ài)用繼承的方式來(lái)實(shí)現(xiàn)代碼復(fù)用,即使是在沒(méi)有多態(tài)關(guān)系的處境下。是否使用繼承的規(guī)矩是繼承只能用在類(lèi)之間有“父子”關(guān)系的處境下。
不要僅僅為了代碼復(fù)用而繼承。當(dāng)你使用組合來(lái)實(shí)現(xiàn)代碼復(fù)用的時(shí)候,是不會(huì)產(chǎn)生繼承關(guān)系的。過(guò)度使用繼承通過(guò)“extends”關(guān)鍵字的話(huà),假設(shè)修改了父類(lèi),會(huì)損壞全體的子類(lèi)。這是由于子類(lèi)和父類(lèi)的緊耦合關(guān)系是在編譯期產(chǎn)生的。
不要僅僅為了多態(tài)而繼承。假設(shè)你的類(lèi)之間沒(méi)有繼承關(guān)系,并且你想要實(shí)現(xiàn)多態(tài),那么你可以通過(guò)接口和組合的方式來(lái)實(shí)現(xiàn),這樣不僅可以實(shí)現(xiàn)代碼重用,同時(shí)也可以實(shí)現(xiàn)運(yùn)行時(shí)的生動(dòng)性。
這就是為什么四人幫GangofFour的設(shè)計(jì)模式里更傾向于使用組合而不是繼承的理由。面試者會(huì)在你的答案里著重關(guān)注這幾個(gè)詞語(yǔ)——“耦合”,“靜態(tài)還是動(dòng)態(tài)”,以及“發(fā)生在編譯期還是運(yùn)行時(shí)”。運(yùn)行時(shí)的生動(dòng)性可以通過(guò)組合來(lái)實(shí)現(xiàn),由于類(lèi)可以在運(yùn)行時(shí)動(dòng)態(tài)地根據(jù)一個(gè)結(jié)果有條件或者無(wú)條件地舉行組合。但是繼承卻是靜態(tài)的。
Q.你能夠通過(guò)實(shí)例來(lái)識(shí)別編譯期繼承和運(yùn)行時(shí)繼承,以及指出Java支持哪種嗎?
A.“繼承”表示動(dòng)作和屬性從一個(gè)對(duì)象傳遞到另外一個(gè)對(duì)象的場(chǎng)景。Java語(yǔ)言本身只支持編譯期繼承,它是通過(guò)“extends”關(guān)鍵字來(lái)產(chǎn)生子類(lèi)的方式實(shí)現(xiàn)的,如下所示:
publicclassParent
publicStringsaySomething
return“Parentiscalled”;
publicclassChildextendsParent
@Override
publicStringsaySomething
returnsuper.saySomething+“,Childiscalled”;
“Child”類(lèi)的saySomething方法的調(diào)用會(huì)返回“Parentiscalled,ChildisCalled”,由于,子類(lèi)的調(diào)用繼承了父類(lèi)的“Parenetiscalled”。關(guān)鍵字“super”是用來(lái)調(diào)用“Parent”類(lèi)的方法。運(yùn)行時(shí)繼承表示在運(yùn)行時(shí)構(gòu)建父/子類(lèi)關(guān)系。Java語(yǔ)言本身不支持運(yùn)行時(shí)繼承,但是有一種替代的方案叫做“代理”或者“組合”,它表示在運(yùn)行時(shí)組件一個(gè)層次對(duì)象的子類(lèi)。這樣可以模擬運(yùn)行時(shí)繼承的實(shí)現(xiàn)。在Java里,代理的典型實(shí)現(xiàn)方式如下:
publicclassParent
publicStringsaySomething
return“Parentiscalled”;
publicclassChild
publicStringsaySomething
returnnewP
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 44435-2024信息與文獻(xiàn)數(shù)字文件(檔案)轉(zhuǎn)換和遷移過(guò)程
- GB/T 25216-2024煤與瓦斯突出危險(xiǎn)性區(qū)域預(yù)測(cè)方法
- 合伙協(xié)議書(shū)簽訂時(shí)的法律審查
- 2024年黃沙石子供貨合同范本
- 專(zhuān)業(yè)承包工地食堂合同書(shū)模板
- 合作經(jīng)營(yíng)生意合同協(xié)議
- 800字代辦委托協(xié)議范本
- 房產(chǎn)按揭貸款借款協(xié)議示例
- 咖啡店外賣(mài)服務(wù)合同
- 2024年二手車(chē)購(gòu)買(mǎi)協(xié)議格式
- 2024年國(guó)家公務(wù)員考試《行測(cè)》真題卷(行政執(zhí)法)答案和解析
- 第二次月考卷-2024-2025學(xué)年統(tǒng)編版語(yǔ)文六年級(jí)上冊(cè)
- 公共基礎(chǔ)知識(shí)1000題題庫(kù)
- 生豬屠宰獸醫(yī)衛(wèi)生檢驗(yàn)人員理論考試題庫(kù)及答案
- 2024年北京公交集團(tuán)第四客運(yùn)分公司招聘筆試參考題庫(kù)附帶答案詳解
- 《陸上風(fēng)電場(chǎng)工程設(shè)計(jì)概算編制規(guī)定及費(fèi)用標(biāo)準(zhǔn)》(NB-T 31011-2019)
- 高中數(shù)學(xué) 第二章 空間向量與立體幾何 2.3.3 空間向量運(yùn)算的坐標(biāo)表示課件2 北師大版選修2-1
- 中國(guó)南陽(yáng)介紹PPTppt
- (高三化學(xué)試卷)--北京四中高三上學(xué)期期中測(cè)驗(yàn)化學(xué)試題
- 溫州市第十四高級(jí)中學(xué)化學(xué)學(xué)科課程建設(shè)綱要
- 輸煤運(yùn)行專(zhuān)業(yè)危險(xiǎn)點(diǎn)及防范措施
評(píng)論
0/150
提交評(píng)論