【JVM】關於類加載器準備階段的一道面試題目

一個經典的延伸問題java

咱們來看一個經典的延伸問題,準備階段談到靜態變量,那麼對於常量和不一樣靜態變量有什麼區別?code

須要明確的是,沒有人可以精確的理解和記憶全部信息,若是碰到這種問題,有直接答案固然最好;沒有的話,就說說本身的思路。ip

咱們定義下面這樣的類型,分別提供了普通靜態變量、靜態常量,常量又考慮到原始類型和引用類型可能有區別。io

public class CLPreparation {
    public static int a = 100;
    public static final int INT_CONSTANT = 1000;
    public static final Integer INTEGER_CONSTANT = Integer.valueOf(10000);
}

編譯並反編譯一下:編譯

Javac CLPreparation.java
Javap –v CLPreparation.class

能夠在字節碼中看到這樣的額外初始化邏輯:class

0: bipush        100
         2: putstatic     #2                  // Field a:I
         5: sipush        10000
         8: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        11: putstatic     #4                  // Field INTEGER_CONSTANT:Ljava/lang/Integer;

這能讓咱們更清楚,普通原始類型靜態變量和引用類型(即便是常量),是須要額外調用 putstaticJVM 指令的,這些是在顯式初始化階段執行,而不是準備階段調用;而原始類型常量,則不須要這樣的步驟。變量

相關文章
相關標籤/搜索