java static關鍵字深入理解

static關鍵字

當一個變量前面有了static這個修飾符,內存會為它分配唯一的一塊存儲空間。


程序跑起來的時候,變量就存在在內存裡了。誰要用它,就去訪問一下它所在的內存。

1.修飾

<code>public class Test {
public void update(){
System.out.println("update");
}
public static class InnerClass{
public static void add(){
System.out.println("============= 內部類 靜態add方法=============");
}
public void delete(){
System.out.println("============= 內部類 delete方法 =============");
}
}
public static void main(String[] args){
Test.InnerClass.add();
InnerClass innerClass = new Test.InnerClass();
innerClass.delete();
Test test =new Test();
test.update();
}
}/<code>

2.修飾方法;

3.修飾變量常量;

4.靜態代碼塊;

static特點:

1,隨著類的加載而加載,也就是說靜態會隨著類的消失而消失,說明他的生命週期最長

2,優先於對象的存在。(靜態先存在,對象後存在。)

3,被所有對象所共享

4,可以直接被類名調用

靜態類作用:

1.靜態類。常見形式作為一般工具類

2.緩存:提前將數據保存到對象中,其實就是加載到內存中,提高效率
3.計數,統計相關的應用

在多線程中使用靜態方法是否有線程安全問題?

在多線程中使用同一個靜態方法時,每個線程使用各自的實例字段(instance field)的副本,而共享一個靜態字段(static field)。所以說,如果該靜態方法不去操作一個靜態成員,只在方法內部使用實例字段(instance field),不會引起安全性問題。但是,如果該靜態方法操作了一個靜態字段,則需要靜態方法中採用互斥訪問的方式進行安全處理。

靜態方法如果沒有使用靜態變量,則沒有線程安全問題。
因為靜態方法內聲明的變量,每個線程調用時,都會新創建一份,而不會共用一個存儲單元。比如這裡的tmp,每個線程都會創建自己的一份,因此不會有線程安全問題;

靜態變量,由於是在類加載時佔用一個存儲區,每個線程都是共用這個存儲區的,所以如果在靜態方法裡使用了靜態變量,這就會有線程安全問題


final是個修飾符,它可以用來修飾類,類的成員,以及局部變量。

final的特點

1 .final修飾類不可以被繼承,但是可以繼承其他類。

2.l final修飾的方法不可以被覆蓋,但父類中沒有被final修飾方法,子類覆蓋後可以加final。

3.l final修飾的變量稱為常量,這些變量只能賦值一次。

4.l 引用類型的變量值為對象地址值,地址值不能更改,但是地址內的對象屬性值可以修改。



分享到:


相關文章: