static、final初始化時機

static

1、jvm虛擬機對類初始化時機之一:遇到putstatic(設置靜態變量)、getstatic(讀取靜態變量)、invokestatic(調用靜態方法)時如果類未初始化則觸發初始化
2、初始化是執行類構造器< clinit >的過程(區別於構造函數也叫實例構造器< init >);
3、類構造器< clinit >方法在編寫的代碼中並不存在,是由編譯器自動收集類中的所有靜態變量的賦值動作和static{}語句合併生成。如果不存在以上值則不生成< clinit >方法。
4、虛擬機會保證一個類的< clinit >方法在多線程環境下被正確的加鎖、同步,如果多個線程同時初始化一個類,則只有一個線程去執行這個類的< clinit >方法,其他線程都阻塞等待
5、被static修飾的類變量,靜態塊執行時機在構造函數之前

final

1、final語義
2、被final修飾的實例字段或者實例代碼塊由實例構造函數< init>方法調用,

final static 常量

1、基礎類型、字符串常量會被編譯進調用者的常量池中,在解析階段賦值
2、引用類型同static

public com.test.TestPrent();
  descriptor: ()V
  flags: ACC_PUBLIC
  Code:
    stack=2, locals=1, args_size=1
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: aload_0
       8: getfield      #3                  // Field i:I
      11: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
      14: return
    LineNumberTable:
      line 13: 0
      line 14: 4
      line 15: 14
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      15     0  this   Lcom/test/TestPrent;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章