Java中的static

1检号、 static在java中到底代表什么熔号,為何要用它赴肚?

static――靜態(tài)――“指定位置“

首先素跺,我們來看看java的內(nèi)存:

java把內(nèi)存分為棧內(nèi)存和堆內(nèi)存二蓝,棧內(nèi)存用來存放一些基本類型的變量和數(shù)組及對(duì)象的引用變量,而堆內(nèi)存主要是來放置對(duì)象的指厌。

用static的修飾的變量和方法刊愚,實(shí)際上是指定了這些變量和方法在內(nèi)存中的“固定位置”-static storage。既然要有“固定位置”那么他們的“大小”似乎就是固定的了踩验,有了固定位置和固定大小的特征了鸥诽,在棧中或堆中開辟空間那就是非常的方便了。如果靜態(tài)的變量或方法在不出其作用域的情況下箕憾,其引用句柄是不會(huì)發(fā)生改變的牡借。

我們常看到:static變量有點(diǎn)類似于C中的全局變量的概念厕九;靜態(tài)表示的是內(nèi)存的共享蓖捶,就是它的每一個(gè)實(shí)例都指向同一個(gè)內(nèi)存地址。 把static拿來扁远,就是告訴JVM它是靜態(tài)的俊鱼,它的引用(含間接引用)都是指向同一個(gè)位置,在那個(gè)地方畅买,你把它改了并闲,它就不會(huì)變成原樣,你把它清理了谷羞,它就不會(huì)回來了帝火。我們常可看到類似以下的例子來說明這個(gè)問題:

class Student {
    static int numberOfStudents = 0;

    Student() {
        numberOfStudents++;
    }
}

每一次創(chuàng)建一個(gè)新的Student實(shí)例時(shí),成員numberOfStudents都會(huì)不斷的遞增,并且所有的Student實(shí)例都訪問同一個(gè)numberOfStudents變量,實(shí)際上int numberOfStudents變量在內(nèi)存中只存儲(chǔ)在一個(gè)位置上湃缎。

多個(gè)實(shí)例共享一個(gè)變量似乎不足以讓我們對(duì)static那么的熱情犀填,實(shí)際上java引入static卻有另外的含義:
(1)、引用static的方法和變量嗓违,不需要和實(shí)例捆綁在一起,這可以提高代碼的編寫的效率九巡,這樣的例子我們隨處可見;

(2)蹂季、java的主類中main()方法本身就是一個(gè)static的冕广,所以main方法的執(zhí)行就是在沒有產(chǎn)生新的實(shí)例的情況;對(duì)于靜態(tài)的東西偿洁,JVM在加載類時(shí)撒汉,就在內(nèi)存中開辟了這些靜態(tài)的空間,所以雖沒有靜態(tài)的main()方法但是程序還是執(zhí)行了涕滋,不過拋出來了無main()方法的異常睬辐。這也不知算不算是java的一個(gè)漏洞;

(3)、如果需要?jiǎng)?chuàng)建一個(gè)脫離于實(shí)例的變量或方法(只與整個(gè)類有關(guān))溉委,那么用static作修飾是再好不過了鹃唯,如我們經(jīng)常看到要統(tǒng)計(jì)實(shí)例實(shí)現(xiàn)的個(gè)數(shù)(通常的例子就是計(jì)數(shù))瓣喊。

(4)坡慌、使用一種靜態(tài)的方法的編程通常叫做防御(defensive)編程,它可以在API供應(yīng)商突然中斷支持的情況下保護(hù)代碼

靜態(tài)塊的初始化要早于非靜態(tài)的,原因就是在于這些東西是在類裝載時(shí)就開始初始化了藻三。

說起static的“局限“洪橘,總結(jié)起來就是:

  • 在static的方法中僅能夠調(diào)用其他的static方法和static變量;
  • 在static方法中不能以任何方式引用this或super棵帽;
  • static變量在定義時(shí)必須進(jìn)行初始化熄求,并且初始化的時(shí)間早于非靜態(tài)。
  • 還有一個(gè)局限我需要具體的說明一下逗概,static的變量的初始化僅能一次弟晚,如下例:
public class Static {
    T1 t1 = new T1(2);
    T1 t2 = new T1(3);
    T1 t3 = new T1(4);

    public Static() {
        System.out.println("t1: " + t1.t);
        System.out.println("t2: " + t2.t);
        System.out.println("t3: " + t3.t);
    }

    public static void main(String args[]) {
        new Static();
    }
}

class T1 {
    static int t = 1;

    T1(int b) {
        t = b;
    }
}

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

t1: 4
t2: 4
t3: 4

該static變量只是接受了最后一次的初始化.實(shí)際這還是我們先前提到的多個(gè)實(shí)例共享一個(gè)靜態(tài)的變量的問題。

總之逾苫,static就是給我們一個(gè)這樣的忠告:static的東西在編譯時(shí)卿城,就已向內(nèi)存要到了存取空間了。

2铅搓、 static在java中怎么用瑟押?

使用static時(shí),要記著我闡述的static代表什么星掰。

static使用非常的簡單多望,

  • 如果要修飾一個(gè)靜態(tài)塊只需:staic {……..}即可(常用靜態(tài)塊來初始化一些變量);
  • 靜態(tài)方法就參照main()的形式:
  • 訪問標(biāo)識(shí) static returnType method(…) {};
  • 靜態(tài)變量就是:static type fields氢烘;

在使用靜態(tài)的方法時(shí)怀偷,可以直接用類名來引用,不需要?jiǎng)?chuàng)建實(shí)例(當(dāng)然創(chuàng)建實(shí)例也是可以的)播玖,例如枢纠,System.out,String.valueOf()等等。

3黎棠、 static 有哪些特點(diǎn)和使用的“局限”?

從上面的分析可知镰绎,static的東西在類加載時(shí)脓斩,就分配了內(nèi)存空間,即編譯時(shí)就為這些成員變量的實(shí)例分配了空間畴栖。

那么在static塊內(nèi)和方法體內(nèi)随静,我們能給它放一個(gè)在內(nèi)存中還沒有著落的變量?顯然與我們先前所說的相左。static的東西燎猛,人家是在static storage中有“指定位置“的恋捆,如果我們茫然的在static的作用域中放置一個(gè)普通的變量,那么編譯時(shí)JVM就毫不客氣的給你個(gè)異常:

non-static variable a cannot be referenced from a static context或non-static method Test() cannot be referenced from a static context(注:Test()是我試驗(yàn)時(shí)的一個(gè)例子)重绷,除非我在static中現(xiàn)場開辟空間沸停,用new來要內(nèi)存。

對(duì)于static的初始化問題昭卓,我們還是值得討論的》呒兀現(xiàn)看下面的例子

public class StaticInit {
    static int i;
    int a;

    public StaticInit() {
        a = 6;
        System.out.println("a 的初始化" + a);
    }

    public static void main(String[] args) {
        new StaticInit();
    }

    static {
        i = 5;
        System.out.println("i 的初始化" + i);
    }
}

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

i 的初始化5
a 的初始化6
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市候醒,隨后出現(xiàn)的幾起案子能颁,更是在濱河造成了極大的恐慌,老刑警劉巖倒淫,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伙菊,死亡現(xiàn)場離奇詭異,居然都是意外死亡敌土,警方通過查閱死者的電腦和手機(jī)镜硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纯赎,“玉大人谦疾,你說我怎么就攤上這事∪穑” “怎么了念恍?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晚顷。 經(jīng)常有香客問我峰伙,道長,這世上最難降的妖魔是什么该默? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任瞳氓,我火速辦了婚禮,結(jié)果婚禮上栓袖,老公的妹妹穿的比我還像新娘匣摘。我一直安慰自己,他們只是感情好裹刮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布音榜。 她就那樣靜靜地躺著,像睡著了一般捧弃。 火紅的嫁衣襯著肌膚如雪赠叼。 梳的紋絲不亂的頭發(fā)上擦囊,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嘴办,去河邊找鬼瞬场。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涧郊,可吹牛的內(nèi)容都是我干的贯被。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼底燎,長吁一口氣:“原來是場噩夢啊……” “哼刃榨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起双仍,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤枢希,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朱沃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苞轿,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年逗物,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搬卒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翎卓,死狀恐怖契邀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情失暴,我是刑警寧澤坯门,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站逗扒,受9級(jí)特大地震影響古戴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矩肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一现恼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黍檩,春花似錦叉袍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肛跌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衍慎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工转唉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稳捆。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓赠法,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乔夯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砖织,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法末荐,內(nèi)部類的語法侧纯,繼承相關(guān)的語法,異常的語法甲脏,線程的語...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • Java中的static關(guān)鍵字解析 本文轉(zhuǎn)子博客園眶熬,單擊此處閱讀原文 static關(guān)鍵字是很多朋友在編寫代碼和閱讀...
    簡單應(yīng)用閱讀 573評(píng)論 1 7
  • 作者:海子原文地址:http://www.cnblogs.com/dolphin0520/ static關(guān)鍵字是很...
    IT程序獅閱讀 1,218評(píng)論 0 16
  • 背景:由于我家寶寶才2歲10個(gè)月,所以我所講的故事需要淺顯易懂并且情節(jié)愉悅結(jié)局美好块请。另外本人喜歡瑜伽娜氏,寶寶也很喜歡...
    漫漫講故事閱讀 180評(píng)論 0 0
  • 2017.7.19 這個(gè)故事寫于兩年前高考前夕。當(dāng)時(shí)的想法很簡單墩新,就是記錄一下自己高中三年蕩氣回腸的生活贸弥。兩年后再...
    YATOAME灬Z閱讀 208評(píng)論 0 0