Java關鍵字總結(一)
阿新 • • 發佈:2021-11-17
static總結:
1、修飾靜態變數,通過類名.變數名,不需要例項化物件,屬於靜態資源,所有類例項共享
2、修飾靜態方法,通過類名.方法,不需要例項化物件,屬於靜態資源,所有類例項共享
3、靜態程式碼塊,類初始化的時候引用,只執行一次
4、靜態資源的載入順序,按照定義順序載入,並且按照父類靜態程式碼塊->子類靜態程式碼快順序執行
5、靜態程式碼塊對應定義在它之後的變數可以賦值,但不能訪問
6、import static 資源,建議少用,影響程式碼的可讀性
注意:靜態方法內不能有非靜態資源,非靜態方法類可以引用靜態資源,static修飾的靜態變數不可序列化(原因:靜態變數屬於類變數,不屬於例項變數)
final總結:
1、修飾引用:
a、修飾基本資料型別,則該資料為常量,值無法修改
b、修飾引用資料型別,如物件、陣列,則該物件、陣列本身可以修改,但指向該物件、陣列的引用不可修改
c、修飾類的引用,該引用必須被當場賦值
2、修飾方法:最終的方法,不可被子類重寫,但可以繼承
3、修飾類:簡稱斷子絕孫類,不可被繼承。如String
transient總結:
1、如果想讓物件中的某個成員變數不被序列化,可以在成員變數上加上transient關鍵字
2、只能修飾變數,不能修飾方法和類
3、使用者自定義的類變數,如果被transient修飾需要實現serializable介面
4、銀行卡、密碼等資料適合用transient修飾
注意:本地變數(native)不能被transient修飾
volatile總結:
volatile可見性是通過彙編加上Lock字首指令,觸發底層的MESI快取一致性協議來實現的,MESI快取的最小單元是快取行,當共享的資料長度超過一個快取行的長度,MESI協議就會失效,會觸發匯流排加鎖機制
1、保證記憶體可見性
2、禁止指令重排序:如單列模式雙重鎖,併發的情況下會出現指令重排序
3、不能保證原子性
synchronized總結:
保證同一時刻只有一個執行緒可以執行某個方法或程式碼塊,也可以保證一個執行緒的變化可見性和共享變數的記憶體可見性可以代替volatile
1、方法
a、例項方法,鎖的是類的例項物件
b、靜態方法,鎖的是類物件
2、程式碼塊
a、例項物件,鎖的是類的例項物件
b、class物件,鎖的是類物件
c、任意例項物件中的變數引數,鎖的的是例項物件
原理:方法級的同步是隱式的,無需通過位元組碼指令控制(monitorenter,monitorexit兩個指令),取而代之的是位元組碼中會出現ACC_SYNCHRONIZED標識,指明該方法為同步方法。