final和static關鍵字辨析
final關鍵字
final關鍵字被用於修飾 變量,方法和類
final修飾的變量若爲基本數據類型,值不可改變,如爲引用數據類型,則引用指向不可改變。
當final修飾一個類時,final類中所有的成員方法都會被隱式的指定爲final類型
static關鍵字
調用格式:
- 類名.靜態變量名
- 類名.靜態方法名()
修飾成員變量和成員方法
被static修飾的成員變量和方法屬於類,被所有的此類的對象所共享,不屬於某一個具體的對象和方法。
正因爲如此,static所修飾的內容需要存儲在共享的區域中,既方法區中(Java虛擬機把方法區描述爲堆的一個邏輯部分,但他有一個別名叫Non-heap,目的是將方法區和堆區分開)。
靜態代碼塊
靜態代碼塊定義在類中,靜態代碼塊在非靜態代碼塊之前執行(類的初始化順序:靜態代碼塊|靜態變量 --》 非靜態代碼塊|非靜態成員變量 --》 構造方法)
靜態代碼塊可以在靜態成員變量定義之前爲其賦值。
public class Test {
static {
a =10;
}
static int a = 11;
public static void main(String[] args){
System.out.println(a);
}
}
這段段代碼是符合規範的。運行結果爲:11 因爲在靜態代碼塊執行結束後又進行了一次賦值操作。
static{}靜態代碼塊與{}非靜態代碼塊(構造代碼塊)
-
相同點: 都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個,定義多個時按定義的順序執行,一般在代碼塊中對一些static變量進行賦值。
-
不同點: 靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—非靜態代碼塊—構造方法)。靜態代碼塊只在第一次new執行一次,之後不再執行,而非靜態代碼塊在每new一次就執行一次。 非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行。
-
一般情況下,如果有些代碼比如一些項目最常用的變量或對象必須在項目啓動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的。如果我們想要設計不需要創建對象就可以調用類中的方法,例如:Arrays類,Character類,String類等,就需要使用靜態方法, 兩者的區別是 靜態代碼塊是自動執行的而靜態方法是被調用的時候才執行的.
public class Test {
static {
System.out.println("靜態代碼塊執行了");
}
{
System.out.println("構造代碼塊執行了");
}
public Test(){
System.out.println("構造方法執行了");
}
public static void main(String[] args){
Test a = new t();
Test b = new t();
}
}
運行結果: