Java——static詳解
在Java語言中,static表示“全域性”或者“靜態”的意思,用來修飾成員變數和成員方法,也可以形成靜態static程式碼塊。
static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類名來訪問,訪問語法為:
類名.靜態方法名(引數列表...)
類名.靜態變數名
到這裡有人可能會想問:是不是我在任何地方都可以呼叫這個變數或者這個方法呢?
顯然,我們的主角具有很大的獨立性——被static修飾的成員變數和成員方法獨立於該類的任何物件。
也就是說,它不依賴類特定的例項,被類的所有例項共享。
那怎麼實現共享呢?
其實,只要這個類被載入,Java虛擬機器就能根據類名在執行時資料區的方法區內找到他們。
(注:如果大家對類的載入順序不瞭解,可以參考.......)
因此,static物件可以在它的任何物件建立之前訪問,無需引用任何物件。
至於誰可以呼叫static方法或者static變數,這個就需要問一問它的修飾符啦~~
1.用public修飾static。
用public修飾的static成員變數和成員方法本質是全域性變數和全域性方法,當宣告它類的物件時,不生成static變數的副本,而是類的
所有例項共享同一個static變數。也就是說,至始至終,就只有這一個static變數。
2.用private修飾static
static變數前可以有private修飾,表示這個變數可以在類的靜態程式碼塊中,或者類的其他
態成員方法中使用),但是要記住一點,它不能在其他類中通過類名來直接引用,這一點很重要。
且實際上你需要搞明白,private是訪問許可權限定,static表示不要例項化就可以使用,這樣就容易理解多了。static前面加上其它訪問許可權關鍵字的效果也以此類推。
結合上下文來說,我們可以這樣理解:static變數(方法)只有一個,它在類初次載入的時候就被建立了,所有人共享一個,不管你有沒有許可權它都在那裡,你有許可權就訪問,沒許可權就不能訪問,就這麼簡單。
好啦,上面簡單地介紹了一下static的特性。
下面來了解一下static在Java語言中的使用。
static在Java語言中的使用主要有四種:(變數、方法、程式碼塊、內部類)
1、static變數
按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫例項變數。
兩者的區別是:
靜態變數在記憶體中只有一個拷貝(節省記憶體),JVM只為靜態分配一次記憶體,在載入類的過程中完成靜態變數的記憶體分配,可用類名直接訪問(方便),當然也可以通過物件來訪問(但是這是不推薦的)。static成員變數的初始化順序按照定義的順序進行初始化。
而對於例項變數,每建立一個例項,就會為例項變數分配一次記憶體,例項變數可以在記憶體中有多個拷貝,互不影響(靈活)。
2、靜態方法
static方法一般稱作靜態方法,由於靜態方法不依賴於任何物件就可以進行訪問,因此對於靜態方法來說,是沒有this的,因為它不依附於任何物件,既然都沒有物件,就談不上this了。並且由於這個特性,在靜態方法中不能訪問類的非靜態成員變數和非靜態成員方法,因為非靜態成員需要通過物件例項訪問,非靜態方法中都隱含this控制代碼。
但是要注意的是,雖然在靜態方法中不能訪問非靜態成員方法和非靜態成員變數,但是在非靜態成員方法中是可以訪問靜態成員方法/變數的。
因此,如果說想在不建立物件的情況下呼叫某個方法,就可以將這個方法設定為static。我們最常見的static方法就是main方法,至於為什麼main方法必須是static的,現在就很清楚了。因為程式在執行main方法的時候沒有建立任何物件,因此只有通過類名來訪問。
另外記住,即使沒有顯示地宣告為static,類的構造器實際上也是靜態方法。
注:因為static方法獨立於任何例項,因此static方法必須被實現,而不能是抽象的abstract。
3、static程式碼塊
static關鍵字還有一個比較關鍵的作用就是 用來形成靜態程式碼塊以優化程式效能。static塊可以置於類中的任何地方,類中可以有多個static塊。在類初次被載入的時候,會按照static塊的順序來執行每個static塊,並且只會執行一次。為什麼說static塊可以用來優化程式效能,是因為它的特性:只會在類載入的時候執行一次。 因此,很多時候會將一些只需要進行一次的初始化操作都放在static程式碼塊中進行。
這個部分比較重要,我在這裡只是簡單地介紹一下,在另一篇文章中我有對static程式碼塊進行詳細介紹。
文章連結:靜態塊的載入順序<<<一定要看喲<<<
4. 靜態內部類(Inner Class)
這個也很重要,我會單開一篇文章。
總結:其實,看完這篇文章,大家可以發現,static的作用完全可以用一句話來概括,即方便在沒有建立物件的情況下來進行呼叫(方法/變數)。
好啦,關於static的一些知識就算總結完啦,當然,static絕對不止是這些知識點,如果大家有什麼別的發現,或者發現了我文中表述不對的地方,歡迎大家一起留言評論,我們一起學習呀~~
Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!