一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java編譯時與運行時概念與實例詳解

java編譯時與運行時概念與實例詳解

2020-09-14 13:47追夢者_wang Java教程

本篇文章通過實例對 java程序編譯時與運行時進行了詳解,需要的朋友可以參考下

Java編譯時與運行時很重要的概念,但是一直沒有明晰,這次專門博客寫明白概念.

基礎概念

編譯時

編譯時顧名思義就是正在編譯的時候.那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機器能識別的代碼.(當然只是一般意義上這么說,實際上可能只是翻譯成某個中間狀態的語言.比如Java只有JVM識別的字節碼,.另外還有啥鏈接器.匯編器.為了了便于理解我們可以統稱為編譯器)

那編譯時就是簡單的作一些翻譯工作,比如檢查老兄你有沒有粗心寫錯啥關鍵字了啊.有啥詞法分析,語法分析之類的過程.就像個老師檢查學生的作文中有沒有錯別字和病句一樣.如果發現啥錯誤編譯器就告訴你.所以有時一些人說編譯時還分配內存啥的肯定是錯誤的說法.

運行時

所謂運行時就是代碼跑起來了.被裝載到內存中去了.(你的代碼保存在磁盤上沒裝入內存之前是個死家伙.只有跑到內存中才變成活的).而運行時類型檢查就與前面講的編譯時類型檢查(或者靜態類型檢查)不一樣.不是簡單的掃描代碼.而是在內存中做些操作,做些判斷.(這樣很多編譯時無法發現的錯誤,在運行就可以發現報錯了,最好還是寫的的時候就避免這個邏輯錯誤就好了)

舉列子

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

上面的代碼你一瞧你知道是錯誤的代碼,數組越界了.但用編譯器沒有報錯,run后才出現了ArrayIndexOutOfBoundsException.可見編譯器其實還是挺笨的,還沒你腦瓜子那么聰明啊,于是你想雖然編譯器笨了點,但運行起來時發現了錯誤也還不算太壞.

面試題

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
理解這幾個概念可以更好地幫助你去了解一些基本的原理。下面是初學者晉級中級水平需要知道的一些問題。
Q.下面的代碼片段中,行A和行B所標識的代碼有什么區別呢?
 
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的值是在編譯期計算的,行B則是在運行時計算的。如果你使用Java反編譯器(例如,jd-gui)來反編譯ConstantFolding.class文件的話,那么你就會從下面的結果里得到答案。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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編譯器使用的優化技術。由于final變量的值不會改變,因此就可以對它們優化。Java反編譯器和javap命令都是查看編譯后的代碼(例如,字節碼)的利器。

方法重載:這個是發生在編譯時的。方法重載也被稱為編譯時多態,因為編譯器可以根據參數的類型來選擇使用哪個方法。

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

如果編譯器要編譯下面的語句的話:

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

它會根據傳入的參數是字符串常量,生成調用#1方法的字節碼

方法覆蓋:這個是在運行時發生的。方法重載被稱為運行時多態,因為在編譯期編譯器不知道并且沒法知道該去調用哪個方法。JVM會在代碼運行的時候做出決定。

?
1
2
3
4
5
6
7
8
9
10
11
12
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;
 }
}

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

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

編譯器是沒法知道傳入的參數reference的類型是A還是B。因此,只能夠在運行時,根據賦給輸入變量“reference”的對象的類型(例如,A或者B的實例)來決定調用方法#3還是方法#4

泛型(又稱類型檢驗):這個是發生在編譯期的。編譯器負責檢查程序中類型的正確性,然后把使用了泛型的代碼翻譯或者重寫成可以執行在當前JVM上的非泛型代碼。這個技術被稱為“類型擦除“。

換句話來說,編譯器會擦除所有在尖括號里的類型信息,來保證和版本1.4.0或者更早版本的JRE的兼容性。

1List myList = new ArrayList(10);

編譯后成為了:

1List myList = new ArrayList(10);

異常(Exception):你可以使用運行時異常或者編譯時異常。

運行時異常(RuntimeException)也稱作未檢測的異常(unchecked exception),這表示這種異常不需要編譯器來檢測。

RuntimeException是所有可以在運行時拋出的異常的父類。一個方法除要捕獲異常外,如果它執行的時候可能會拋出

RuntimeException的子類,那么它就不需要用throw語句來聲明拋出的異常。

例如:NullPointerException,ArrayIndexOutOfBoundsException,等等

受檢查異常(checked exception)都是編譯器在編譯時進行校驗的,通過throws語句或者try{}cathch{} 語句塊來處理檢測異常。編譯器會分析哪些異常會在執行一個方法或者構造函數的時候拋出。

希望本篇文章對您有所幫助

原文鏈接:http://blog.csdn.net/wang_8649/article/details/70239304

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 暖暖的视频完整视频韩国免费 | 男gay网站视频免费观看 | naruto hentai玖辛奈| 国产盗摄女厕美女嘘嘘 | 2021久久| 骚虎tv| chinese老太grandma | 亚洲29p | 日韩欧美不卡片 | 亚州春色 | 五月婷婷丁香在线视频 | 国产精品天天影视久久综合网 | 成人在线免费观看视频 | 国产亚洲精品自在线亚洲情侣 | 亚洲狠狠婷婷综合久久蜜桃 | 亚洲国产综合自在线另类 | 欧美日韩一级视频 | 日韩欧美精品一区二区 | bt岛www| 麻豆小视频在线观看 | 国产伦久视频免费观看视频 | 久久三级视频 | 国产精品免费精品自在线观看 | 日本卡1卡2卡4卡免费 | 美女大乳被捏羞羞漫画 | 免费的强动漫人物 | 九九精品视频在线观看 | 婷婷网址| nxgx在线观看国产中文 | 成年女人毛片免费观看中文w | 亚洲免费精品视频 | 人成网站在线观看 | 肥胖女性大bbbbbb视频女厕 | 男人午夜免费视频 | 美女被上漫画 | 国产精品视频久久久 | 日本卡一卡2卡3卡4精品卡无人区 | 亚洲AV久久无码精品蜜桃 | 亚洲精品国产一区二区第一页 | 成人精品亚洲人成在线 | 果冻传媒在线视频观看免费 |