Java static 的一兩點使用

這篇文章是關(guān)于Java static關(guān)鍵字的使用召锈,主要會介紹以下的內(nèi)容:

  1. static 的概念
  2. static的各種應(yīng)用
  3. 總結(jié)

static 是什么

static 顧名思義是靜態(tài)的意思都哭。與this相對结耀,static表示所修飾的部分是屬于類本身所有的浩嫌,不依賴與某個具體的實例孵稽。 而this上個博客已經(jīng)講了,可參考this的使用.this表示的是對調(diào)用方法的那個當(dāng)前對象的引用罩润,可以看做是類的實例的引用赫舒,依賴于具體的實例延旧。所以這也就是《Java編程思想》里面說的

“static方法就是沒有this的方法谋国。在static方法內(nèi)部不能調(diào)用非靜態(tài)方法,反過來是可以的迁沫。而且可以在沒有創(chuàng)建任何對象的前提下,僅僅通過類本身來調(diào)用static方法捌蚊。這實際上正是static方法的主要用途集畅。”

在了解他使用之前缅糟,我們先思考一下挺智,為什么我們需要使用staitc,一切都通過對象去調(diào)用不也可以嗎窗宦?
這樣做是可以赦颇,對象是可以調(diào)用實例變量,實例方法赴涵,類方法媒怯,類成員變量。但是這樣真的好嗎髓窜?我們有一些東西是不依賴具體對象扇苞。比如我們有一些工具類,如Math寄纵,里面的cos鳖敷,sin這些都是客觀存在,不會改變的程拭。任何一個對象都不影響Math里面的任何東西定踱,相反,像我們定義一個圓這個類恃鞋,那么圓的半徑崖媚,圓的面積顯然是不同的圓 是不同的 這就不能用static。
好了山宾,我們已經(jīng)知道了static是什么至扰,以及該什么時候去使用它,那我們我們都可以怎么用它呢资锰?

static的用法

  1. static 變量
  2. static 方法
  3. static 代碼塊

static 變量

static變量就是靜態(tài)的成員變量敢课,所謂靜態(tài)變量就是靜態(tài)變量是歸類本身所有,被所有對象所共享,在內(nèi)存中只有一個副本直秆。而非靜態(tài)的就是每個對象所有濒募,在內(nèi)存中有多個副本,每個對象的副本互不影響圾结。
比如我們常常自己定義或者是看源碼中有很多常量瑰剃,這些常量就是用final static修飾的。用static來修飾筝野,讓這個常量不需要new一個對象就能得到晌姚,非常的方便。例子如下:

/**
 * Created by byhieg on 2016/6/20.
 */
public class CityFragment extends Fragment {
    public static final String TAG = "CityFragment";
    //省略其他代碼
}

這樣歇竟,我們就可以直接通過CityFragment.TAG來得到TAG挥唠。

static 方法

static 方法和static 變量的使用目的是一致的,一般用來不通過創(chuàng)建對象來使用方法焕议,用來做工具類的方法宝磨。如我們可以把處理字符串的操作的方法統(tǒng)一放到一個固定類里面,我們調(diào)用的時候盅安,只需要通過類名.方法名就可以唤锉,省去每次創(chuàng)建對象浪費的內(nèi)存。比如下面的例子

/**
 * Created by byhieg on 2016/6/20.
 */
public class StringUtils {
    //根據(jù)輸入的指定的字符,分割字符串
    public static String[] splitString(String str,String regex) {
        String [] result = str.split(regex);
        return result;
    }

    //刪除指定位置的字符串
    public static String delPosOfString(String str, int[] pos) {
        StringBuffer sb = new StringBuffer(str);
        for(int i = 0 ; i < pos.length;i++) {
            sb.deleteCharAt(pos[i]);
        }
        return sb.toString();
    }
}

我們可以直接這么調(diào)用StringUntils.splitString(args1,args2)
下面别瞭,我們說一些用static 方法的注意事項窿祥。我們看一下下面的例子。

/**
 * Created by byhieg on 2016/6/20.
 */
public class Main {
    public static final String str = "byhieg";
    public String error = "error";

    public void test() {
        System.out.println(str);
        System.out.println(error);
    }

    public static void main(String[] args) {
        System.out.println(test());
        System.out.println(error);
        System.out.println(str);
    }
}

運行會出現(xiàn)下面的錯誤

Error:(13, 28) java: 無法從靜態(tài)上下文中引用非靜態(tài) 方法 test()
Error:(14, 28) java: 無法從靜態(tài)上下文中引用非靜態(tài) 變量 error

雖然我們舉例用的Main方法畜隶,但他是static方法壁肋,使用的是統(tǒng)一的static語法規(guī)則。報錯的原因是因為在靜態(tài)方法中我們是無法調(diào)用非靜態(tài)的成員變量和方法籽慢。因為非靜態(tài)的方法和變量是依賴于對象創(chuàng)建浸遗,對象才能調(diào)用的。所以是不可以調(diào)用的箱亿。但是在非靜態(tài)方法中跛锌,是可以調(diào)用全部,因為上文說了 靜態(tài)的是歸所有對象共享届惋,非靜態(tài)是省略了this才調(diào)用成功的髓帽。

/**
 * Created by byhieg on 2016/6/20.
 */
public class Main {
    public static final String str = "byhieg";
    public String error = "error";

    public void test() {
        System.out.println(str);
        System.out.println(error);
        //此處省略了this 實際應(yīng)該是this.test1(),this.error
        //所以也是通過對象對調(diào)用的非靜態(tài)的變量和方法
        test1();
    }


    public void test1() {
        System.out.println(str);
        System.out.println(error);
    }
    public static void main(String[] args) {
        new Main().test();
    }
}

static 初始化塊

在說明靜態(tài)初始化塊的時候,我們先了解一下什么是初始化塊脑豹。當(dāng)我們需要生成很多對象的時候郑藏,每次都需要執(zhí)行構(gòu)造方法,如果我們的構(gòu)造方法中瘩欺,有一些代碼是不依賴參數(shù)的必盖,我們就可以把這些代碼提取出來拌牲,放到同一個地方。這個地方我們稱之為初始化塊歌粥。
初始化塊允許定義很多個塌忽,執(zhí)行順序與書寫的順序有關(guān),但實際沒什么卵用失驶,因為他是創(chuàng)建Java對象時隱式執(zhí)行土居,且全部被執(zhí)行,完全可以把他們放到一起去執(zhí)行嬉探。初始化塊的執(zhí)行會先于構(gòu)造器擦耀,這點很重要。
接下來涩堤,我們看一下static靜態(tài)塊埂奈,static靜態(tài)塊除了有靜態(tài)塊的優(yōu)點以外,他還有static所帶來的優(yōu)點定躏,即他在類初次被加載時執(zhí)行,且只會執(zhí)行一次芹敌。不會像普通代碼塊一樣痊远,每次對象創(chuàng)建時都會執(zhí)行,這樣我們可以把一些造成空間浪費的語句氏捞,放到靜態(tài)初始化塊中執(zhí)行碧聪。比如下面的代碼

/**
 * Created by byhieg on 2016/6/20.
 */
public class Main {
    
    public Main() {
        Integer a = new Integer(1024);
        //省略其他初始化代碼
        
    }
}

每次在new一個新對象的時候,都會創(chuàng)建一個新的Integer對象液茎。這樣無疑浪費空間逞姿,這時我們就需要用靜態(tài)代碼塊,把Integer a放進(jìn)去捆等,就可以保證只會初始化一次滞造。如下:

/**
 * Created by byhieg on 2016/6/20.
 */
public class Main {
    public static Integer a;
    
    static {
        a = new Integer(1024);
    }

    public Main() {
        //省略構(gòu)造器其他代碼
    }
}

靜態(tài)初始化塊執(zhí)行的順序在普通初始化塊執(zhí)行之前,因為只有類被加載并初始化之后栋烤,我們才能創(chuàng)建類的的實例谒养,但以后再創(chuàng)建的實例的時候就不會再執(zhí)行靜態(tài)初始化塊了。

總結(jié)

static 是與類相關(guān)的一個關(guān)鍵字明郭,所修飾的部分表明該部分是歸類所有买窟。比如static修飾變量就表明該變量是靜態(tài)變量,被所有對象所共享薯定,被類所擁有始绍。static修飾方法,與變量時一致的话侄,只是在靜態(tài)方法中是不允許調(diào)用非靜態(tài)的變量和方法亏推。而靜態(tài)代碼塊是比較特殊的存在学赛,用來初始化一些共有的東西,在類被加載時只執(zhí)行一次径簿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罢屈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子篇亭,更是在濱河造成了極大的恐慌缠捌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译蒂,死亡現(xiàn)場離奇詭異曼月,居然都是意外死亡,警方通過查閱死者的電腦和手機柔昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門哑芹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捕透,你說我怎么就攤上這事聪姿。” “怎么了乙嘀?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵末购,是天一觀的道長。 經(jīng)常有香客問我虎谢,道長盟榴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任婴噩,我火速辦了婚禮擎场,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘几莽。我一直安慰自己迅办,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布银觅。 她就那樣靜靜地躺著礼饱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪究驴。 梳的紋絲不亂的頭發(fā)上镊绪,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音洒忧,去河邊找鬼蝴韭。 笑死,一個胖子當(dāng)著我的面吹牛熙侍,可吹牛的內(nèi)容都是我干的榄鉴。 我是一名探鬼主播履磨,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼庆尘!你這毒婦竟也來了剃诅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤驶忌,失蹤者是張志新(化名)和其女友劉穎矛辕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體付魔,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡聊品,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了几苍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻屈。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妻坝,靈堂內(nèi)的尸體忽然破棺而出伸眶,到底是詐尸還是另有隱情,我是刑警寧澤刽宪,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布赚抡,位于F島的核電站,受9級特大地震影響纠屋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盾计,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一售担、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧署辉,春花似錦族铆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至材鹦,卻和暖如春逝淹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桶唐。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工栅葡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤泽。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓欣簇,卻偏偏與公主長得像规脸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熊咽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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