java中的static關(guān)鍵字

又到了讀代碼了解java知識(shí)的時(shí)間了掂为。今天我們來了解下java中的static關(guān)鍵字荔棉,來看看它的作用和一些相關(guān)原理蔫劣。

package com.xingshulin;

public class StaticTest {

    private String a = "I am a! ";
    private static String b = "I am b! ";

    // 構(gòu)造函數(shù)
    public StaticTest() {
        System.out.println("I am constructor!");
    }

    // static代碼塊
    static {
        System.out.println("I am static block 1!");
//        System.out.println(a);
    }

    public static void main(String args[]) {
        // 生成StaticTest類的對(duì)象
        StaticTest st = new StaticTest();

        // 打印變量a
        System.out.println(st.a);

        // 打印變量b
        System.out.println(StaticTest.b);
        System.out.println(b);

        // 運(yùn)行靜態(tài)方法
        staticMethod();
        StaticTest.staticMethod();

        // 運(yùn)行非靜態(tài)方法
        st.nonStaticMethod();
    }

    // 靜態(tài)方法
    public static void staticMethod() {
        System.out.println("I am static method!");
        //System.out.println(a);
    }

    // 實(shí)例方法(非靜態(tài)方法)
    public void nonStaticMethod() {
        System.out.println("I am non static method");
        System.out.println(a);
        System.out.println(b);
    }

    // static代碼塊
    static {
        System.out.println("I am static block 2!");
    }

    private static String c;

    // static代碼塊
    static {
        System.out.println("I am static block " + c + "!");

    }

}

運(yùn)行結(jié)果如下:

I am static block 1!
I am static block 2!
I am static block null!
I am constructor!
I am a! 
I am b! 
I am b! 
I am static method!
I am static method!
I am non static method
I am a! 
I am b! 

這段代碼很簡單鞭盟,但是也足夠說明static關(guān)鍵字的作用了。從上面的例子中我們可以看到static的三種表現(xiàn)形式:static變量、static方法劈彪、static代碼塊

static變量

在代碼中的變量b和c就是static變量竣蹦,有人會(huì)問了,那變量a是什么沧奴?其實(shí)變量a叫實(shí)例變量痘括。它們的區(qū)別是變量a是在創(chuàng)建對(duì)象后分配的;而static變量b和c不同滔吠,static變量被所有對(duì)象共享纲菌,在內(nèi)存中只有一個(gè)副本,是在類加載的過程中分配到JVM的方法區(qū)中屠凶。static變量可用類名直接訪問驰后,如代碼:


image.png

在這里我們多說一下變量c,我們是沒有給它賦初值的矗愧,但是并沒有造成編譯出錯(cuò)灶芝,而且在打印的時(shí)候發(fā)現(xiàn)它的值被自動(dòng)置為了null(因?yàn)槭荢tring類型)。這說明static變量不像局部變量那樣需要賦初值才能編譯唉韭,我認(rèn)為主要的原因應(yīng)該是static變量在方法區(qū)分配夜涕,而局部變量在棧中分配,方法區(qū)的內(nèi)存可以動(dòng)態(tài)變化属愤,而棧的大小在線程運(yùn)行前就需要是已知的女器,所以局部變量必須有初值(此處留坑,不一定理解的對(duì))

static方法

和static變量類似住诸,static方法也不需要?jiǎng)?chuàng)建對(duì)象就可以被所有對(duì)象調(diào)用驾胆,并可直接通過類名調(diào)用。


image.png

也正是由于這個(gè)特性贱呐,static方法中不能包含this等和對(duì)象有關(guān)的關(guān)鍵字丧诺,更不能包含實(shí)例變量和實(shí)例方法,否則編譯會(huì)出現(xiàn)問題:


image.png

但是也如上圖所示奄薇,實(shí)例方法中卻可以包含實(shí)例變量和static變量驳阎,原因很簡單,就不贅述了馁蒂。

static代碼塊

static關(guān)鍵字還有一個(gè)比較關(guān)鍵的作用就是用來形成static代碼塊以優(yōu)化程序性能呵晚。static塊可以置于類中的任何地方,類中可以有多個(gè)static塊沫屡。在類初次被加載的時(shí)候饵隙,會(huì)按照static塊的順序來執(zhí)行每個(gè)static塊,并且只會(huì)執(zhí)行一次沮脖。
從上面的代碼結(jié)果來看癞季,的確是在類加載的時(shí)候就進(jìn)行了static塊的運(yùn)行劫瞳,因?yàn)樗械拇a塊打印都在構(gòu)造函數(shù)之前。


運(yùn)行結(jié)果

而且和static方法一樣绷柒,static代碼塊中不能包含this等和對(duì)象有關(guān)的關(guān)鍵字,更不能包含實(shí)例變量和實(shí)例方法涮因,否則編譯會(huì)出現(xiàn)問題:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末废睦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子养泡,更是在濱河造成了極大的恐慌嗜湃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜掩,死亡現(xiàn)場離奇詭異购披,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肩榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門刚陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人株汉,你說我怎么就攤上這事筐乳。” “怎么了乔妈?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蝙云,是天一觀的道長。 經(jīng)常有香客問我路召,道長勃刨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任股淡,我火速辦了婚禮身隐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揣非。我一直安慰自己抡医,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布早敬。 她就那樣靜靜地躺著忌傻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搞监。 梳的紋絲不亂的頭發(fā)上水孩,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音琐驴,去河邊找鬼俘种。 笑死秤标,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宙刘。 我是一名探鬼主播苍姜,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悬包!你這毒婦竟也來了衙猪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤布近,失蹤者是張志新(化名)和其女友劉穎垫释,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撑瞧,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棵譬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了预伺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片订咸。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扭屁,靈堂內(nèi)的尸體忽然破棺而出算谈,到底是詐尸還是另有隱情,我是刑警寧澤料滥,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布然眼,位于F島的核電站,受9級(jí)特大地震影響葵腹,放射性物質(zhì)發(fā)生泄漏高每。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一践宴、第九天 我趴在偏房一處隱蔽的房頂上張望鲸匿。 院中可真熱鬧,春花似錦阻肩、人聲如沸带欢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乔煞。三九已至,卻和暖如春柒室,著一層夾襖步出監(jiān)牢的瞬間渡贾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工雄右, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留空骚,地道東北人纺讲。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像囤屹,于是被迫代替她去往敵國和親熬甚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容