Java?static關(guān)鍵字詳細(xì)解析
static目的
java中的static關(guān)鍵字主要用于內(nèi)存管理。
static范圍
使用范圍:java static關(guān)鍵字可以用在變量、方法、代碼塊和嵌套類中。
作用范圍:static關(guān)鍵字屬于類,而不是類的實(shí)例。
靜態(tài)(static)修飾
- 變量、方法:稱為類變量/方法、靜態(tài)變量/方法;修飾變量或方法,表示這個(gè)變量/方法屬于這個(gè)類,而不屬于單個(gè)對(duì)象
- 代碼塊:稱為靜態(tài)代碼塊;修飾代碼塊,表示該代碼塊為靜態(tài)代碼塊
- 嵌套類:稱為靜態(tài)內(nèi)部類;修飾內(nèi)部類,表示該類為靜態(tài)內(nèi)部類??捎糜趯?shí)現(xiàn)單例模式。
- 可用于修飾import,進(jìn)行靜態(tài)導(dǎo)包,導(dǎo)入類中所有靜態(tài)方法。最常見的使用場(chǎng)景是在JUnit進(jìn)行單元測(cè)試時(shí)。
靜態(tài)變量
類的成員變量可以分為以下兩種:
- 靜態(tài)變量(或稱為類變量),指被 static 修飾的成員變量。
- 實(shí)例變量,指沒(méi)有被 static 修飾的成員變量。
靜態(tài)變量與實(shí)例變量的區(qū)別如下:
1)靜態(tài)變量
- 運(yùn)行時(shí),Java 虛擬機(jī)只為靜態(tài)變量分配一次內(nèi)存,加載類過(guò)程中完成靜態(tài)變量的內(nèi)存分配。
- 在類的內(nèi)部,可以在任何方法內(nèi)直接訪問(wèn)靜態(tài)變量。
- 在其他類中,可以通過(guò)類名訪問(wèn)該類中的靜態(tài)變量。
2)實(shí)例變量
- 每創(chuàng)建一個(gè)實(shí)例,Java 虛擬機(jī)就會(huì)為實(shí)例變量分配一次內(nèi)存。
- 在類的內(nèi)部,可以在非靜態(tài)方法中直接訪問(wèn)實(shí)例變量。
- 在本類的靜態(tài)方法或其他類中則需要通過(guò)類的實(shí)例對(duì)象進(jìn)行訪問(wèn)。
靜態(tài)變量在類中的作用如下:
- 靜態(tài)變量可以被類的所有實(shí)例共享,因此靜態(tài)變量可以作為實(shí)例之間的共享數(shù)據(jù),增加實(shí)例之間的交互性。
- 如果類的所有實(shí)例都包含一個(gè)相同的常量屬性,則可以把這個(gè)屬性定義為靜態(tài)常量類型,從而節(jié)省內(nèi)存空間。例如,在類中定義一個(gè)靜態(tài)常量 PI。
- 靜態(tài)變量的好處:它能使程序存儲(chǔ)器高效(即它節(jié)省內(nèi)存)。
靜態(tài)方法
同成員變量,成員方法也可以分為以下兩種:
- 靜態(tài)方法(或稱為類方法),指被 static 修飾的成員方法。
- 實(shí)例方法,指沒(méi)有被 static 修飾的成員方法。
靜態(tài)方法與實(shí)例方法的區(qū)別:
靜態(tài)方法,屬于類,而不屬于類的對(duì)象。
- 它通過(guò)類直接被調(diào)用,無(wú)需創(chuàng)建類的對(duì)象。
- 靜態(tài)方法中,不能使用 this 關(guān)鍵字,也不能直接訪問(wèn)所屬類的實(shí)例變量和實(shí)例方法;
- 靜態(tài)方法中,可以直接訪問(wèn)所屬類的靜態(tài)變量和靜態(tài)方法。
- 同this 關(guān)鍵字,super 關(guān)鍵字也與類的實(shí)例相關(guān),靜態(tài)方法中不能使用 super 關(guān)鍵字。
實(shí)例方法,可直接訪問(wèn)所屬類的靜態(tài)變量、靜態(tài)方法、實(shí)例變量和實(shí)例方法。
靜態(tài)方法與靜態(tài)變量好處:
- 屬于類級(jí)別,無(wú)需創(chuàng)建對(duì)象就即可直接使用,使用方便。
- 全局唯一,內(nèi)存中唯一,靜態(tài)變量可以唯一標(biāo)識(shí)某些狀態(tài)。
- 類加載時(shí)候初始化,常駐在內(nèi)存,調(diào)用快捷方便。
靜態(tài)方法與靜態(tài)變量缺點(diǎn):
- 靜態(tài)方法不能調(diào)用非靜態(tài)的方法和變量。
- 不能使用this和super關(guān)鍵字。
靜態(tài)方法與靜態(tài)變量適用場(chǎng)景:
- 靜態(tài)方法,最適合工具類中方法的定義;比如文件操作,日期處理方法等。
- 靜態(tài)方法,適合入口方法定義;比如單例模式,因從外部拿不到構(gòu)造函數(shù),所以定義一個(gè)靜態(tài)的方法獲取對(duì)象非常有必要。
- 靜態(tài)變量適合全局變量的定義;舉例:用一個(gè)布爾型靜態(tài)成員變量做控制標(biāo)志。
靜態(tài)代碼塊
定義:靜態(tài)代碼塊,是 Java 類中的 static{ } 修飾的代碼。
作用:用于類初始化時(shí),為類的靜態(tài)變量賦初始值,提升程序性能。
靜態(tài)代碼塊的特點(diǎn)如下:
靜態(tài)代碼塊,有點(diǎn)類似于一個(gè)方法,但不可以存在于任何方法體內(nèi)。
靜態(tài)代碼塊,可以置于類中的任何地方,類中可以有多個(gè)靜態(tài)初始化塊。
Java 虛擬機(jī)在加載類時(shí)執(zhí)行,將只需要進(jìn)行一次初始化的操作放在 static 代碼塊。
類中含多個(gè)靜態(tài)代碼塊,Java虛擬機(jī)將按它們?cè)陬愔谐霈F(xiàn)的順序依次執(zhí)行,且都執(zhí)行一次。
同靜態(tài)代碼塊與靜態(tài),不能直接訪問(wèn)類的實(shí)例變量和實(shí)例方法,需通過(guò)類的對(duì)象訪問(wèn)。
靜態(tài)類
java中一個(gè)類要被聲明為static的,只有一種情況,就是靜態(tài)內(nèi)部類(內(nèi)嵌類)。如在外部類聲明為static的,程序會(huì)編譯都不會(huì)通過(guò)。
- 1、靜態(tài)內(nèi)部類,跟靜態(tài)方法一樣,只能訪問(wèn)靜態(tài)成員變量和方法,不能訪問(wèn)非靜態(tài)方法和屬性。
- 2、普通內(nèi)部類,可以訪問(wèn)任意外部類的成員變量和方法。
- 3、靜態(tài)內(nèi)部類,可以聲明普通成員變量和方法,而普通內(nèi)部類不能聲明static成員變量和方法。
- 4、靜態(tài)內(nèi)部類,可以單獨(dú)初始化。
可用于實(shí)現(xiàn)單例模式。
public class StaticSingleton { /** * 只有當(dāng)顯式調(diào)用getInstance()方法之后,這里的靜態(tài)內(nèi)部類SingletonHolder才會(huì)被加載 * 從而將INSTANCE初始化 * 因此,通過(guò)靜態(tài)內(nèi)部類實(shí)現(xiàn)的單例模式是懶漢式的 */ private static class SingletonHolder { // 通過(guò)靜態(tài)內(nèi)部類持有實(shí)例 private static final StaticSingleton INSTANCE = new StaticSingleton(); } private StaticSingleton() { } // 用private隱藏構(gòu)造方法 public static StaticSingleton getInstance() { return SingletonHolder.INSTANCE; } }
static變量存儲(chǔ)在方法區(qū)(Method Area)
方法區(qū)是被所有線程共享,所有字段和方法字節(jié)碼,以及一些特殊方法,如構(gòu)造函數(shù),接口代碼也在此定義,簡(jiǎn)單說(shuō),所有定義的方法的信息都保存在該區(qū)域,此區(qū)域?qū)儆诠蚕韰^(qū)間。
靜態(tài)變量(static)、常量(final)、類信息(構(gòu)造方法、接口定義)(Class)、運(yùn)行時(shí)的常量池存在方法區(qū)中,但是實(shí)例變量存在堆內(nèi)存中,和方法區(qū)無(wú)關(guān)。
到此這篇關(guān)于Java static關(guān)鍵字詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java static關(guān)鍵 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝
這篇文章主要介紹了Spring如何集成ibatis項(xiàng)目并實(shí)現(xiàn)dao層基類封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念2014-04-04Java設(shè)計(jì)模式之抽象工廠模式(Abstract?Factory)
這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式之抽象工廠模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java如何在沙箱環(huán)境中測(cè)試支付寶支付接口
這篇文章主要介紹了Java如何在沙箱環(huán)境中測(cè)試支付寶支付接口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10windows 32位eclipse遠(yuǎn)程hadoop開發(fā)環(huán)境搭建
這篇文章主要介紹了windows 32位eclipse遠(yuǎn)程hadoop開發(fā)環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下2016-07-07Java 判斷實(shí)體對(duì)象及所有屬性是否為空的操作
這篇文章主要介紹了Java 判斷實(shí)體對(duì)象及所有屬性是否為空的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Java引用傳遞實(shí)現(xiàn)方式以及與值傳遞的區(qū)別
這篇文章主要給大家介紹了關(guān)于Java引用傳遞實(shí)現(xiàn)方式以及與值傳遞的區(qū)別的相關(guān)資料,引用傳遞指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址直接傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù),需要的朋友可以參考下2023-09-09Java 實(shí)戰(zhàn)項(xiàng)目之CRM客戶管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)CRM客戶管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11java中兩個(gè)字符串的拼接、整數(shù)相加和浮點(diǎn)數(shù)相加實(shí)現(xiàn)代碼
這篇文章主要為大家介紹java中從鍵盤讀取用戶輸入兩個(gè)字符串,實(shí)現(xiàn)這兩個(gè)字符串的拼接、整數(shù)相加和浮點(diǎn)數(shù)相加,并輸出結(jié)果,需要的朋友可以參考下2021-05-05