一個經典的延伸問題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;
這能讓咱們更清楚,普通原始類型靜態變量和引用類型(即便是常量),是須要額外調用 putstatic
等 JVM
指令的,這些是在顯式初始化階段執行,而不是準備階段調用;而原始類型常量,則不須要這樣的步驟。變量