static哮伟,字面意思是靜態(tài)干花,在java中可以用來修飾變量妄帘、方法、類池凄,也可以形成靜態(tài)代碼塊抡驼。static修飾的字段和成員方法不依賴于類的任何實(shí)例,在類加載時(shí)肿仑,會(huì)提取class的類型信息存放到方法區(qū)中致盟。如:類型和直接超類以及直接接口全限定名、類型的常量池尤慰、方法信息( 方法名馏锡、方法的返回類型、方法的參數(shù)的數(shù)量和類型伟端、方法的修飾符杯道、方法的字節(jié)碼、操作數(shù)棧和棧幀中局部變量的大小责蝠、異常表)党巾、類靜態(tài)變量等。類的所有實(shí)例共享方法區(qū)中的類信息霜医。
使用static不需要new出一個(gè)類來齿拂,最基本的用法
- 類名.變量名或類名.方法名
- 使用import static 靜態(tài)導(dǎo)入,直接在另一個(gè)類中使用變量名和方法名
- static final用來修飾成員變量和成員方法肴敛,可簡(jiǎn)單理解為“全局常量”署海。
- 對(duì)于變量,表示一旦給值就不可修改医男,并且通過類名可以訪問砸狞。
- 對(duì)于方法,表示不可覆蓋昨登,并且可以通過類名直接訪問趾代。
- 對(duì)于被static和final修飾過的實(shí)例常量,實(shí)例本身不能再改變了丰辣,但對(duì)于一些容器類型(比如撒强,ArrayList、HashMap)的實(shí)例變量笙什,不可以改變?nèi)萜髯兞勘旧砥冢梢孕薷娜萜髦写娣诺膶?duì)象。
靜態(tài)變量
類中的的成員可以分為靜態(tài)變量和實(shí)例變量琐凭。靜態(tài)變量存在于方法區(qū)中芽隆,在類加載是完成靜態(tài)變量的內(nèi)存分配,被該類的所有實(shí)例共享,任何一個(gè)實(shí)例對(duì)靜態(tài)變量的修改后其他實(shí)例訪問到的都是改變后的值胚吁。實(shí)例變量在每創(chuàng)建一個(gè)實(shí)例之后都會(huì)為實(shí)例變量分配內(nèi)存牙躺,實(shí)例變量可以在內(nèi)存中存在多個(gè),互不影響腕扶。
靜態(tài)方法
靜態(tài)方法中不能有this和super關(guān)鍵字孽拷,不能訪問類的實(shí)例變量和實(shí)例方法,因?yàn)閷?shí)例成員與特定的對(duì)象關(guān)聯(lián)半抱。static方法獨(dú)立于任何實(shí)例脓恕,所以static方法不能使抽象的abstract,必須被實(shí)現(xiàn)窿侈。
靜態(tài)代碼塊
靜態(tài)代碼塊是在類中獨(dú)立于類成員的static語句塊炼幔,不在任何方法體類,加載類時(shí)會(huì)執(zhí)行這些靜態(tài)的代碼塊史简,如果static代碼塊有多個(gè)乃秀,jvm按照先后順序依次執(zhí)行,每個(gè)代碼塊只會(huì)被執(zhí)行一次乘瓤。如果父類有靜態(tài)代碼塊环形,則先執(zhí)行父類的再執(zhí)行子類的胁塞。靜態(tài)代碼可以在不創(chuàng)建實(shí)例的情況下完成一些初始化工作卵慰。
靜態(tài)內(nèi)部類
靜態(tài)內(nèi)部類無法訪問外部類的實(shí)例成員抵窒,因?yàn)槠渲胁话赶蛲獠款悓?duì)象的引用,但可以訪問外部類的靜態(tài)成員统抬。靜態(tài)內(nèi)部類中可以有靜態(tài)方法,也可以有非靜態(tài)方法危队。靜態(tài)內(nèi)部類的初始化方法:外部類.內(nèi)部類 XXX = new 外部類.內(nèi)部類();
靜態(tài)導(dǎo)入
import static導(dǎo)入某個(gè)類中的靜態(tài)資源聪建,這樣可以不適用類名.資源名,可以直接使用資源名茫陆。
靜態(tài)綁定機(jī)制
被static金麸、private、final修飾的方法以及構(gòu)造方法都會(huì)被編譯成invokestatic指令簿盅,jvm會(huì)使用靜態(tài)綁定機(jī)制來調(diào)用這些方法挥下。所謂靜態(tài)綁定機(jī)制,就是在編譯階段就能夠確定調(diào)用哪個(gè)方法的方式桨醋。