static、final、static final的區別
1. final
final類不能被繼承,沒有子類,final類中的方法預設是final的
final方法不能被子類的方法覆蓋,但可以被繼承
final成員變量表示常量,只能被賦值一次,賦值後不能再被改變
final不能用於修飾構造方法
private不能被子類方法覆蓋,private型別的方法預設是final型別的
final修飾的變數有三種:靜態變數、例項變數和區域性變數,分別表示三種類型的常量。
注意:final變數定義的時候,可以先宣告,而不給初值,這中變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。
2. static
static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊,但是Java語言中沒有全域性變數的概念。
被static修飾的成員變數和成員方法獨立於該類的任何物件。也就是說,它不依賴類特定的例項,被類的所有例項共享。只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區的方法區內定找到他們。因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。
用public修飾的static成員變數和成員方法本質是全域性變數和全域性方法,當宣告它類的物件市,不生成static變數的副本,而是類的所有例項共享同一個static變數。
- 類成員變數
- 靜態變數(類變數): static修飾
- 例項變數 : 無static修飾
- 區域性變數
3. static和final一起使用
static final用來修飾成員變數和成員方法,可以理解為“全域性變數”
對於變數,表示一旦給值就不可修改,並且通過類名可以訪問。
對於方法,表示不可覆蓋,並且可以通過類名直接訪問。
注意:
對於被static和final修飾過的例項常量,例項本身不能再改變了,但對於一些容器型別(比如,ArrayList、HashMap)的例項變數,不可以改變容器變數本身,但可以修改容器中存放的物件。