天天看點

Java中static和final的作用

java中的兩個關鍵字:static和final是非通路的修飾符,用法大緻相似,但也有一些不同,現在我們來讨論一下。

static:

1、static修飾符代表靜态,Java中的變量或方法都隻會有兩種狀态,靜态或者動态,靜态的變量或方法是定義類的時候,直接寫進了方法區裡,也就是直接寫在了記憶體中,即使不指派也會有自己的預設值。而動态的變量和方法顧名思義,是要先在記憶體中開辟一片空間,然後才開始給記憶體裡寫東西。類似于new關鍵字這樣,先開辟空間。定義的時候記憶體中是沒有的。要自己動态建立。

靜态變量:static修飾的成員變量獨立于該類的任何對象,就是該類的所有對象共享的。無論定義多少個對象,靜态變量隻有一份。隻要加載這個類,在方法區裡就會給靜态變量開辟空間。注意:局域變量不能被聲明為靜态的。因為局域變量是動态建立的,記憶體中沒有。

靜态方法:在Java中動态方法中可以調用靜态方法,因為靜态方法确确實實存在,而靜态方法不能調用動态方法,因為要動态建立。可以建立個對象之後,用對象在靜态方法中調用動态方法。因為此時在記憶體中已經為對象開辟了一片記憶體。是以可以調用。舉個例子:

Java中static和final的作用

運作結果為:

Java中static和final的作用

由于靜态方法是所有對象所共享的,是以在靜态方法中不能使用this,super等關鍵字。而且隻能通路類中靜态的成員變量或成員方法。

靜态代碼塊:用static獨立于成員的語句塊,當類加載時,JVM會執行這些代碼塊。和構造方法不同當加載類後就會執行。并且隻會執行一次。

static和final:用static和final修飾的變量不能被修改,父類用static和final修飾的成員方法子類不能重寫。

final:

fina修飾變量:final能修飾成員變量、靜态變量和局部變量。這些變量的初始化時要麼定義時初始化,要麼在構造方法中初始化。final變量在定義時可以先聲明而不指派,成為final空白,無論什麼時候編譯器要確定final空白在調用時必須要初始化。(一般你直接寫上會比較好,還友善)

final修飾方法:如果一個類不允許子類覆寫某個方法,就把這個方法聲明為final方法。

final修飾類:用final修飾的類不能被繼承,即為最終類。在設計類時,如果不希望被繼承就定義為final。其中的成員方法都預設是final的。

其實吧,就可以把final了解成為一個鎖,這個鎖鎖住的東西是不能被改變的。final在記憶體空間中不像static一樣,可以開辟記憶體空間,因為final可以聲明局部變量,是以兩者還是有差別的。static開辟空間讓所有對象共享這一片資料,而final則是個鎖,鎖住這片資料你想看、想調用可以,想改變就不行。