java中的static詳解

關於static:

在Java語言中,static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊。

1、static變量

按照是否靜態的對類成員變量進行分類可分兩種:

一種是被static修飾的變量,叫靜態變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。

兩者的區別是: 

對於靜態變量在內存中只有一個拷貝(節省內存),JVM只爲靜態分配一次內存,在加載類的過程中完成靜態變量的內存分配,可用 類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。 
對於實例變量,每創建一個實例,就會爲實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響(靈活)。

2、靜態方法

靜態方法可以直接通過類名調用,任何的實例也都可以調用,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實 例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。因爲實例成員與特定的對象 關聯!

因爲static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。

 

----------------------------------------------------------------

總之,被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。 

 

java中的全局變量和全局方法:java中沒有全局變量和全局方法的概念(也就是不可以直接這樣定義),但用public修飾的static成員變量和成員方法本質是全局變量和全局方法。當聲明它類的對象時,不生成static變量的副本,而是類的所有實例共享同一個static變量。 

 

static變量前可以有private修飾,表示這個變量可以在類的靜態代碼塊或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用),但是不能在其他類中通過類名來直接引用,這一點很重要。

-----------------------------------------------------------------

 

3、static代碼塊

在Java的類中可以定義static的代碼,這樣類初始化前會先執行static的代碼段。這在程序設計時會有很多好處,比如可以對類中的靜態對象進行初始化。當類中定義了多個靜態代碼段,則會從依次調用,參看例子

package test;

public class StaticCode{
    public static String str;
    static{
     str="adsfasdf";
    }
 public static void main(String[] args){
  // TODO Auto-generated method stub
        System.out.print(StaticCode.str);
 }
}

 

4、靜態內部類

在定義內部類的時候,可以在其前面加上一個權限修飾符static。此時這個內部類就變爲了靜態內部類。不過由於種種的原因,如使用上的限制等 等因素(具體的使用限制,筆者在下面的內容中會詳細闡述),在實際工作中用的並不是很多。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章