最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java編譯時(shí)與運(yùn)行時(shí)概念與實(shí)例詳解

 更新時(shí)間:2017年04月19日 15:38:19   作者:追夢(mèng)者_(dá)wang  
本篇文章通過(guò)實(shí)例對(duì) java程序編譯時(shí)與運(yùn)行時(shí)進(jìn)行了詳解,需要的朋友可以參考下

Java編譯時(shí)與運(yùn)行時(shí)很重要的概念,但是一直沒(méi)有明晰,這次專(zhuān)門(mén)博客寫(xiě)明白概念.

基礎(chǔ)概念

編譯時(shí)

編譯時(shí)顧名思義就是正在編譯的時(shí)候.那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機(jī)器能識(shí)別的代碼.(當(dāng)然只是一般意義上這么說(shuō),實(shí)際上可能只是翻譯成某個(gè)中間狀態(tài)的語(yǔ)言.比如Java只有JVM識(shí)別的字節(jié)碼,.另外還有啥鏈接器.匯編器.為了了便于理解我們可以統(tǒng)稱(chēng)為編譯器)

那編譯時(shí)就是簡(jiǎn)單的作一些翻譯工作,比如檢查老兄你有沒(méi)有粗心寫(xiě)錯(cuò)啥關(guān)鍵字了啊.有啥詞法分析,語(yǔ)法分析之類(lèi)的過(guò)程.就像個(gè)老師檢查學(xué)生的作文中有沒(méi)有錯(cuò)別字和病句一樣.如果發(fā)現(xiàn)啥錯(cuò)誤編譯器就告訴你.所以有時(shí)一些人說(shuō)編譯時(shí)還分配內(nèi)存啥的肯定是錯(cuò)誤的說(shuō)法.

運(yùn)行時(shí)

所謂運(yùn)行時(shí)就是代碼跑起來(lái)了.被裝載到內(nèi)存中去了.(你的代碼保存在磁盤(pán)上沒(méi)裝入內(nèi)存之前是個(gè)死家伙.只有跑到內(nèi)存中才變成活的).而運(yùn)行時(shí)類(lèi)型檢查就與前面講的編譯時(shí)類(lèi)型檢查(或者靜態(tài)類(lèi)型檢查)不一樣.不是簡(jiǎn)單的掃描代碼.而是在內(nèi)存中做些操作,做些判斷.(這樣很多編譯時(shí)無(wú)法發(fā)現(xiàn)的錯(cuò)誤,在運(yùn)行就可以發(fā)現(xiàn)報(bào)錯(cuò)了,最好還是寫(xiě)的的時(shí)候就避免這個(gè)邏輯錯(cuò)誤就好了)

舉列子

int arr[] = {1,2,3}; 
int result = arr[4]; 
System.out.println(result); 
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4 

上面的代碼你一瞧你知道是錯(cuò)誤的代碼,數(shù)組越界了.但用編譯器沒(méi)有報(bào)錯(cuò),run后才出現(xiàn)了ArrayIndexOutOfBoundsException.可見(jiàn)編譯器其實(shí)還是挺笨的,還沒(méi)你腦瓜子那么聰明啊,于是你想雖然編譯器笨了點(diǎn),但運(yùn)行起來(lái)時(shí)發(fā)現(xiàn)了錯(cuò)誤也還不算太壞.

面試題

理解這幾個(gè)概念可以更好地幫助你去了解一些基本的原理。下面是初學(xué)者晉級(jí)中級(jí)水平需要知道的一些問(wèn)題。 
Q.下面的代碼片段中,行A和行B所標(biāo)識(shí)的代碼有什么區(qū)別呢?

public class ConstantFolding {

 static final int number1 = 5;

 static final int number2 = 6;

 static int number3 = 5;

 static int number4= 6;

 public static void main(String[ ] args) {

 int product1 = number1 * number2; //line A

 int product2 = number3 * number4; //line B

 }

}
                                                                                                                                                                            

A.在行A的代碼中,product的值是在編譯期計(jì)算的,行B則是在運(yùn)行時(shí)計(jì)算的。如果你使用Java反編譯器(例如,jd-gui)來(lái)反編譯ConstantFolding.class文件的話,那么你就會(huì)從下面的結(jié)果里得到答案。

public class ConstantFolding
{
 static final int number1 = 5;
 static final int number2 = 6;
 static int number3 = 5;
 static int number4 = 6;

 public static void main(String[ ] args)
 {
 int product1 = 30;
 int product2 = number3 * number4;
 }
}

常量折疊是種Java編譯器使用的優(yōu)化技術(shù)。由于final變量的值不會(huì)改變,因此就可以對(duì)它們優(yōu)化。Java反編譯器和javap命令都是查看編譯后的代碼(例如,字節(jié)碼)的利器。

方法重載:這個(gè)是發(fā)生在編譯時(shí)的。方法重載也被稱(chēng)為編譯時(shí)多態(tài),因?yàn)榫幾g器可以根據(jù)參數(shù)的類(lèi)型來(lái)選擇使用哪個(gè)方法。

public class {
 public static void evaluate(String param1); // method #1
 public static void evaluate(int param1); // method #2
}

如果編譯器要編譯下面的語(yǔ)句的話:

1evaluate(“My Test Argument passed to param1”);

它會(huì)根據(jù)傳入的參數(shù)是字符串常量,生成調(diào)用#1方法的字節(jié)碼

方法覆蓋:這個(gè)是在運(yùn)行時(shí)發(fā)生的。方法重載被稱(chēng)為運(yùn)行時(shí)多態(tài),因?yàn)樵诰幾g期編譯器不知道并且沒(méi)法知道該去調(diào)用哪個(gè)方法。JVM會(huì)在代碼運(yùn)行的時(shí)候做出決定。

public class A {
 public int compute(int input) { //method #3
 return 3 * input;
 } 
}

public class B extends A {
 @Override
 public int compute(int input) { //method #4
 return 4 * input;
 } 
}

子類(lèi)B中的compute(..)方法重寫(xiě)了父類(lèi)的compute(..)方法。如果編譯器遇到下面的代碼:

public int evaluate(A reference, int arg2) {
 int result = reference.compute(arg2);
}

編譯器是沒(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)型擦除“。

換句話來(lái)說(shuō),編譯器會(huì)擦除所有在尖括號(hào)里的類(lèi)型信息,來(lái)保證和版本1.4.0或者更早版本的JRE的兼容性。

1List myList = new ArrayList(10);

編譯后成為了:

1List myList = new ArrayList(10);

異常(Exception):你可以使用運(yùn)行時(shí)異?;蛘呔幾g時(shí)異常。

運(yùn)行時(shí)異常(RuntimeException)也稱(chēng)作未檢測(cè)的異常(unchecked exception),這表示這種異常不需要編譯器來(lái)檢測(cè)。

RuntimeException是所有可以在運(yùn)行時(shí)拋出的異常的父類(lèi)。一個(gè)方法除要捕獲異常外,如果它執(zhí)行的時(shí)候可能會(huì)拋出

RuntimeException的子類(lèi),那么它就不需要用throw語(yǔ)句來(lái)聲明拋出的異常。

例如:NullPointerException,ArrayIndexOutOfBoundsException,等等

受檢查異常(checked exception)都是編譯器在編譯時(shí)進(jìn)行校驗(yàn)的,通過(guò)throws語(yǔ)句或者try{}cathch{} 語(yǔ)句塊來(lái)處理檢測(cè)異常。編譯器會(huì)分析哪些異常會(huì)在執(zhí)行一個(gè)方法或者構(gòu)造函數(shù)的時(shí)候拋出。

希望本篇文章對(duì)您有所幫助

相關(guān)文章

  • javaweb 國(guó)際化:DateFormat,NumberFormat,MessageFormat,ResourceBundle的使用

    javaweb 國(guó)際化:DateFormat,NumberFormat,MessageFormat,ResourceBu

    本文主要介紹javaWEB國(guó)際化的知識(shí),這里整理了詳細(xì)的資料及實(shí)現(xiàn)代碼,有興趣的小伙伴可以參考下
    2016-09-09
  • java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法

    java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法

    Java中CPU占用過(guò)高是一個(gè)常見(jiàn)的問(wèn)題,可能是由于線程過(guò)多、死循環(huán)、長(zhǎng)時(shí)間的阻塞、死鎖、GC頻繁等原因?qū)е碌?這篇文章主要介紹了java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法,需要的朋友可以參考下
    2025-03-03
  • SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)

    SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn)

    本文主要介紹了SpringBoot3集成SLF4J+logback進(jìn)行日志記錄的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • idea使用jclasslib插件查看字節(jié)碼

    idea使用jclasslib插件查看字節(jié)碼

    這篇文章主要為大家介紹了idea使用jclasslib插件查看字節(jié)碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java處理數(shù)據(jù)庫(kù)不支持的emoji表情符問(wèn)題解決

    java處理數(shù)據(jù)庫(kù)不支持的emoji表情符問(wèn)題解決

    這篇文章主要介紹了java處理數(shù)據(jù)庫(kù)不支持的emoji表情符問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot中的@ControllerAdvice注解原理詳解

    SpringBoot中的@ControllerAdvice注解原理詳解

    這篇文章主要介紹了SpringBoot中的@ControllerAdvice注解原理詳解,在SpringBoot應(yīng)用程序啟動(dòng)過(guò)程中,Spring會(huì)掃描所有的類(lèi),尋找?guī)в蠤ControllerAdvice注解的類(lèi)這些方法會(huì)被添加到一個(gè)映射表中,以便后續(xù)處理異常時(shí)能找到對(duì)應(yīng)的處理方法,需要的朋友可以參考下
    2024-01-01
  • Springboot的@Cacheable注解使用方法

    Springboot的@Cacheable注解使用方法

    @Cacheable 是 Spring 框架提供的一種基于緩存的注解,它可以被應(yīng)用在方法上以指示該方法的結(jié)果需要被緩存起來(lái),緩存在哪個(gè) Cache 中以及該方法使用何種緩存鍵,以下代碼展示了如何使用 @Cacheable 注解,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java中Calendar類(lèi)的一些常用方法小結(jié)

    Java中Calendar類(lèi)的一些常用方法小結(jié)

    項(xiàng)目當(dāng)中,我們經(jīng)常會(huì)涉及到對(duì)時(shí)間的處理,Date類(lèi)最主要的作用就是獲得當(dāng)前時(shí)間,同時(shí)這個(gè)類(lèi)里面也具有設(shè)置時(shí)間以及一些其他的功能,但更推薦使用 Calendar 類(lèi)進(jìn)行時(shí)間和日期的處理,這篇文章主要給大家介紹了關(guān)于Java中Calendar類(lèi)的一些常用方法,需要的朋友可以參考下
    2021-11-11
  • JavaWeb評(píng)論功能實(shí)現(xiàn)步驟以及代碼實(shí)例

    JavaWeb評(píng)論功能實(shí)現(xiàn)步驟以及代碼實(shí)例

    項(xiàng)目初始版本上線,有時(shí)間寫(xiě)點(diǎn)東西記錄一下項(xiàng)目中的心得體會(huì),通過(guò)這個(gè)項(xiàng)目學(xué)習(xí)了很多,要寫(xiě)下來(lái)的有很多,先從評(píng)論功能開(kāi)始吧,下面這篇文章主要給大家介紹了關(guān)于JavaWeb評(píng)論功能實(shí)現(xiàn)步驟以及代碼的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯

    Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯

    這篇文章主要為大家介紹了Spring?Security密碼解析器PasswordEncoder自定義登錄邏輯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

南木林县| 乌拉特前旗| 日喀则市| 商南县| 新巴尔虎左旗| 乐业县| 安乡县| 陇南市| 贡嘎县| 武胜县| 孟州市| 呈贡县| 竹山县| 黔西县| 都昌县| 万安县| 遂昌县| 安多县| 封开县| 剑阁县| 冕宁县| 上虞市| 万山特区| 湖北省| 辽中县| 娄烦县| 台南县| 章丘市| 亚东县| 保德县| 松滋市| 镇雄县| 安泽县| 泰安市| 朝阳区| 威信县| 沙湾县| 慈溪市| 湖北省| 蓬溪县| 华蓥市|