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;