java中的靜態變量,靜態方法與靜態代碼塊詳解

java中的類的生命週期分爲裝載,鏈接,初始化,使用,和卸載五個過程。java

而靜態代碼在類的初始化階段被初始化。函數

而非靜態代碼則在類的使用階段(也就是實例化一個類的時候)纔會被初始化。this

  • 靜態變量
  • 能夠將靜態變量理解爲類變量(與對象無關),而實例變量則屬於一個特定的對象。spa

    靜態變量有兩種狀況:.net

    • 靜態變量是基本數據類型,這種狀況下在類的外部沒必要建立該類的實例就能夠直接使用
    • 靜態變量是一個引用。這種狀況比較特殊,主要問題是因爲靜態變量是一個對象的引用,那麼必須初始化這個對象以後才能將引用指向它。
    • 所以若是要把一個引用定義成static的,就必須在定義的時候就對其對象進行初始化
    1. public class TestForStaticObject{  
    2.          static testObject o = new testObject (); //定義一個靜態變量並實例化  
    3. public static void main(String args[]){  
    4. //在main中直接以「類名.靜態變量名.方法名」的形式使用testObject的方法  
    5.      }  
    6. }  
      • 靜態方法
      • 與類變量不一樣,方法(靜態方法與實例方法)在內存中只有一份,不管該類有多少個實例,都共用一個方法對象

        靜態方法與實例方法的不一樣主要有:blog

        • 靜態方法能夠直接使用,而實例方法必須類實例化以後經過對象來調用
        • 在外部調用靜態方法時,可使用「類名.方法名」或者「對象名.方法名」的形式。
        • 實例方法只能使用這種方式對象名.方法名
        • 靜態方法只容許訪問靜態成員。而實例方法中能夠訪問靜態成員和實例成員。
        • 靜態方法中不能使用this(由於this是與實例相關的)。

靜態代碼塊生命週期

在java類中,能夠將某一塊代碼聲明爲靜態的。內存

[java]view plaincopyget

static {  

//靜態代碼塊中的語句  

}  

靜態代碼塊主要用於類的初始化。它只執行一次,而且在同屬於一個類的main函數以前執行

靜態代碼塊的特色主要有:

靜態代碼塊會在類被加載時自動執行

靜態代碼塊只能定義在類裏面不能定義在方法裏面

靜態代碼塊裏的變量都是局部變量,只在塊內有效。

一個類中能夠定義多個靜態代碼塊,按順序執行。

靜態代碼塊只能訪問類的靜態成員,而不容許訪問實例成員

靜態代碼塊和靜態函數的區別

java 靜態代碼塊:

通常狀況下,若是有些代碼必須在項目啓動前就執行的時候,須要使用靜態代碼塊,這種代碼是主動執行的,它只執行一次而且在同屬於一個類的main函數以前執行

靜態函數:

須要在項目啓動的時候就初始化,在不建立對象的狀況下,其餘程序來調用的時候,須要使用靜態方法,這種代碼是被動執行的.

注意:

(1)靜態變量是屬於整個類的變量而不是屬於某個對象的。注意不能把任何方法體內的變量聲明爲靜態,例如:
fun()
{
static int i=0;//非法。
}

(2)一個類可使用不包含在任何方法體中的靜態代碼塊,當類被載入時,靜態代碼塊被執行,且只被執行一次,靜態塊經常使用來執行類屬性的初始化。例如:
static
{
}

主程序類中的的靜態變量先於靜態代碼塊初始化,其後進入主函數類(程序入口處),其後根據靜態函數的調用狀況,才能選擇性的初始化。

相關文章
相關標籤/搜索