複習筆記-static 和final

(轉)地址:http://blog.csdn.net/i0048egi/article/details/55005403

static 和final

static 靜態修飾關鍵字,可以修飾 變量,程序塊,類的方法;

 當你定義一個static的變量的時候jvm會將將其分配在內存堆上,所有程序對它的引用都會指向這一個地址而不會重新分配內存;

修飾一個程序塊的時候(也就是直接將代碼寫在static{…}中)時候,虛擬機就會優先加載靜態塊中代碼,這主要用於系統初始化;
當修飾一個類方法時候你就可以直接通過類來調用而不需要新建對象。

final 只能賦值一次;修飾變量、方法及類,
當你定義一個final變量時,jvm會將其分配到常量池中,程序不可改變其值;當你定義一個方法時,改方法在子類中將不能被重寫;當你修飾一個類時,該類不能被繼承。

static和final使用範圍:類、方法、變量。

2.區別和聯繫:

2.1.static 含義:靜態的,被 static 修飾的方法和屬性只屬於類不屬於類的任何對象。
2.2.static 用法:
2.2.1.static 可以修飾【內部類】、方法和成員變量。
2.2.2.static【不可以修飾外部類】、【不可以修飾局部變量】(因爲 static 本身就是定義爲類級別的,所以局部級別的變量是不可以用 static 修飾的)。

2.3 final 含義:【只能賦值一次】的。
2.2.final 用法:
2.2.1.final 修飾屬性,表示屬性【只能賦值一次】,(1)基本類型:值不能被修改;(2)引用類型:引用不可以被修改該。
2.2.2.final 修飾方法,表示方法不可以重寫,但是可以被子類訪問(如果方法不是 private 類型話)。
2.2.2.final 修飾類,表示類不可以被繼承。

3.聯合使用 static final

3.1.適用範圍:

3.1.2.兩者範圍的交集,所以只能修飾:成員變量、方法、內部類。

3.2.含義:也是二者交集:
3.2.1.方法:屬於類的方法且不可以被重寫。
3.2.2.成員變量:屬於類的變量且只能賦值一次。
3.2.3.內部類:屬於外部類,且不能被繼承

transient
類型修飾符,只能用來修飾字段,如果用transient聲明一個實例變量,當對象存儲時,它的值不需要維持。換句話來說就是,用transient關鍵字標記的成員變量不參與序列化過程。

volatile
volatile也是變量修飾符,只能用來修飾變量。volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。

在此解釋一下Java的內存機制:

Java使用一個主內存來保存變量當前值,而每個線程則有其獨立的工作內存。線程訪問變量的時候會將變量的值拷貝到自己的工作內存中,這樣,當線程對自己工作內存中的變量進行操作之後,就造成了工作內存中的變量拷貝的值與主內存中的變量值不同。

Java語言規範中指出:爲了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。

這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。

而volatile關鍵字就是提示VM:對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。

使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,不必使用。

由於使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章