轉載請注明原文地址:https://www.cnblogs.com/ygj0930/p/10843135.html
一:transient
用途:Java中一個類在定義時如果實現了Serilizable接口,那么這個類的對象就可以被序列化。(序列化:把對象內容轉化為byte數組。反序列化:從byte數組提取信息重構出對象),但是我們考慮到類中的某些重要屬性(如:密碼)不想被序列化,那么我們可以用transient關鍵字修飾它。
用法:在聲明成員變量時作為修飾符。
舉例:
private transient InputStream is;
二:instanceof
用途:指出對象是否是特定類的一個實例,返回一個布爾值作為結果,以判斷這個對象是否是這個特定類或者是它的子類的一個實例。
用法:result = object instanceof class
舉例:
if p instanceof Person: .... else: ....
三:final
用途:可以用於聲明成員變量、方法、類以及靜態變量。final聲明的內容不允許被更改。
1)final類:用final去修飾一個類的時候,表示這個類不能被繼承,因此就不存在被子類修改的可能了。
2)final方法:父類中定義的被final修飾的方法,不能在子類中被重寫。
3)final變量:必須要在聲明的同時賦予初始值;並且之后不允許更改變量的值(如果修飾的成員變量是基本類型,則表示這個變量的值不能改變;如果修飾的成員變量是一個引用類型,則是說這個引用類型變量所保存的地址不能變,但是這個引用所指向的對象里面的內容還是可以改變的。)
四:static
用途:static的主要作用在於創建獨立於具體對象的域變量或者方法。
用法:作為關鍵字用於變量聲明、方法定義、代碼塊前修飾。
特點:
1)static可以修飾變量、方法、代碼塊
2)被static修飾的內容是獨立於該類的任何對象的,不屬於任何一個實例對象,而是被類的實例對象所共享
3)在類被加載的時候,就會自動去加載被static修飾的部分
4)當一個類加載完畢之后,即便沒有創建對象,也可以去訪問靜態內容
注意事項:
1)靜態方法中沒有this關鍵字,因為靜態是隨着類的加載而加載,而this是隨着對象的創建而存在的。
2)靜態比對象優先存在,因此靜態可以訪問靜態的內容,但是靜態不能訪問非靜態的內容。
3)非靜態的可以去訪問靜態的內容,因為靜態的內容已存在。
五:volatile
用途:volatile只能修飾變量。該變量對於所有線程可見,所有作用在該變量上的操作引起變量的值的變化都會第一時間通知到所有使用它的線程。
原理:每個線程在使用volatile變量時,如果對變量的值作出了改變,則CPU強制線程立刻把新的值寫入主存中。而其他線程在使用到這個變量時,不是從緩存中讀取過期值而是直接從主存中讀取最新值。
用法:修飾成員變量。
六:synchronized
用途:可以把任何一個非null 對象 作為"鎖",當synchronized作用在方法上時,鎖住的便是對象實例(this);當作用在靜態方法時鎖住的便是對象對應的Class實例,因為 Class數據存在於永久帶,因此靜態方法鎖相當於該類的一個全局鎖;當synchronized作用於某一代碼域時,鎖住的便是對應的代碼塊。
原理:syncrhoized實現時使用了自旋鎖,當一個線程進入競爭隊列前,先自旋(等一等看鎖會不會釋放,一旦釋放立刻獲得鎖對象),自旋期間線程可以做一些無意義的操作來實現暫時占用CPU而不是阻塞。線程自旋超過一定時間還沒獲得鎖,就進入競爭隊列被篩選。
用法:修飾 方法、代碼塊。
與volatile比較:
1)volatile比synchronized的使用和執行成本會更低,因為它不會引起線程上下文的切換和調度,也不會引發線程阻塞。
2)volatile僅能實現變量的修改可見性,但不具備原子特性,而synchronized(和lock)則可以保證變量的修改可見性和原子性。(原子性:操作不可被分割執行)
七:const
const是java中的預留關鍵字(java中預留關鍵字還有goto),現在沒有作為關鍵字。常見於C,C++中,類似於Java的final。
Java中定義常量是通過static final組合來實現的,不是const。