1. 程式人生 > 其它 >詳解static 和 final 和 static final區別

詳解static 和 final 和 static final區別

眾所周知,static 是靜態修飾關鍵字:可以修飾變數,程式塊,方法,類。

1.修飾變數。

得知:如果static修飾的是變數,則JVM會將將其分配在記憶體堆上,該變數就與物件無關,所有對該變數的引用都指向同一個地址。

2.修飾程式塊

結論:JVM就會優先載入靜態塊中程式碼,這主要用於系統初始化。

3.修飾方法:在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件,靜態方法在訪問本類的成員時,只允許訪問靜態成員,而不允許訪問例項成員變數和例項方法。

4.修飾類。在我們的熟知之中,static 修飾符一般用於修飾變數,程式塊,方法,但是什麼時候使用static來修飾類呢?

內部類。如果在外部類宣告為static,程式會編譯都不會過。

內部類特點如下:

  1. 1.不持有外部類的引用(普通內部類持有)
  2. 2.可以直接建立例項,不需要先建立外部類(普通內部類需要)
  3. 3.可以有靜態成員變數、方法(普通內部類不行)和非靜態成員變數、方法
  4. 4.只可以直接訪問外部類靜態成員,不可以直接訪問外部類的非靜態成員(普通內部類可以),需要通過傳入外部類引用的方式才能訪問
  5. 5.載入一個類時,其內部類不會同時被載入。一個類被載入,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被呼叫時發生

那就很簡單引出,什麼時候會使用靜態內部類呢?

我們總結下:

由於 INSTANCE 是常量,因此只能賦值一次;它還是靜態的,因此隨著內部類一起載入,這種也是單例懶漢模式的一種實現方式,同時保證了執行緒安全。

 

final 關鍵字可以用來修飾類,方法和變數

1.修飾類

表示該類不允許被繼承,final類中的成員方法都會被隱式的指定為final方法。

2.修飾方法

表示該方法不能被重寫,一個類的private方法會隱式的被指定為final方法。

3.修飾變數

表示該變數必須初始化,且值不能改變。如果是基本型別則值不能改變,如果是引用型別,則引用地址不能改變,但是這個引用所指向的物件裡面的內容還是可以改變的。

static final 一起用:

static修飾的屬性強調它們只有一個,final修飾的屬性表明是一個常數(建立後不能被修改)。static final修飾的屬性表示一旦給值,就不可修改,並且可以通過類名訪問。

static final也可以修飾方法,表示該方法不能重寫,可以在不new物件的情況下呼叫。