static修飾符可以用來修飾類的成員變量、成員方法和代碼塊。
用static修飾的成員變量表示靜態(tài)變量,可以直接通過類名來訪問;
用static修飾的成員方法表示靜態(tài)方法,可以直接通過類名來訪問;
用static修飾的程序代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)加載類時(shí),就會(huì)執(zhí)行該代碼塊。
static變量
???
??? (1)靜態(tài)變量與實(shí)例變量的區(qū)別:
靜態(tài)變量在內(nèi)存中只有一個(gè)拷貝,運(yùn)行時(shí)Java虛擬機(jī)只為靜態(tài)變量分配一次內(nèi)存,在加載類的過程中完成靜態(tài)類變量的內(nèi)存分配。可以直接通過類名訪問靜態(tài)變量;
對于實(shí)例變量,每創(chuàng)建一個(gè)實(shí)例,就會(huì)為實(shí)例變量分配一次內(nèi)存,實(shí)例變量可以在內(nèi)存中有多個(gè)拷貝,互不影響。
??? (2)static變量,提供了全局變量的功能:
能被類的所有實(shí)例共享,可作為實(shí)例之間進(jìn)行交流的共享數(shù)據(jù);
如果類的所有實(shí)例都包含一個(gè)相同的常量屬性,可以把這個(gè)屬性定義為靜態(tài)常量類型,從而節(jié)省內(nèi)存空間。
static方法
??? (1)靜態(tài)方法可訪問的內(nèi)容
??? 靜態(tài)方法不需要實(shí)例化就可以被調(diào)用,因此在靜態(tài)方法中不能使用this, super關(guān)鍵字,也不能直接訪問所屬類的實(shí)例變量和實(shí)例方法,但是可以直接訪問所屬類的靜態(tài)變量和靜態(tài)方法。
??? (2)實(shí)例方法可訪問的內(nèi)容
??? 在實(shí)例方法中可以直接訪問所屬類的靜態(tài)變量、靜態(tài)方法、實(shí)例變量和實(shí)例方法。
??? (3)靜態(tài)方法必須被實(shí)現(xiàn)
??? (4)作為程序入口的main()方法是靜態(tài)方法
???
??? main()方法必須用static修飾,這是因?yàn)榘裮ain()定義為靜態(tài)方法,可以使得Java虛擬機(jī)只要加載了main()方法所屬的類,就能執(zhí)行main()方法,而無須先創(chuàng)建這個(gè)類的實(shí)例。
??? 在main()靜態(tài)方法也是不能直接訪問實(shí)例變量和實(shí)例方法的。
??? (5)方法的字節(jié)碼都位于方法區(qū)
???
??? 不管實(shí)例方法,還是靜態(tài)方法,它們的字節(jié)碼都位于方法區(qū)內(nèi)。
static代碼塊
??? 類中可以包含靜態(tài)代碼塊,它不存在任何方法體中。在Java虛擬機(jī)加載類時(shí)會(huì)執(zhí)行這些靜態(tài)代碼塊,每個(gè)靜態(tài)代碼塊只會(huì)被執(zhí)行一次。
??? Tips:
Java虛擬機(jī)加載靜態(tài)代碼塊后,再執(zhí)行main()方法;
類的構(gòu)造方法用于初始化類的實(shí)例,而類的靜態(tài)代碼塊則可用于初始化類,給類的靜態(tài)變量賦初始化值。
靜態(tài)代碼塊與靜態(tài)方法一樣,也不能直接訪問類的實(shí)例變量和實(shí)例方法,而必須通過實(shí)例的引用來訪問它們。