Java靜態(tài)(static)關(guān)鍵字指南

1. 引言

在本文中窟蓝,我們將詳細探討Java語言的static關(guān)鍵字。我們將找到如何將關(guān)鍵字static應(yīng)用于變量篮绿,方法孵延,塊,嵌套類及其區(qū)別亲配。

2.靜態(tài)關(guān)鍵字剖析

在Java編程語言中尘应,關(guān)鍵字static指示特定成員屬于某個類型本身,而不是該類型的實例吼虎。

這意味著僅創(chuàng)建該靜態(tài)成員的一個實例犬钢,該實例在該類的所有實例之間共享。

https://www.baeldung.com/java-static

關(guān)鍵字可以應(yīng)用于變量思灰,方法玷犹,塊和嵌套類。

3. 靜態(tài)字段(或類變量)

在Java中洒疚,如果將某個字段聲明為靜態(tài)歹颓,則將創(chuàng)建該字段的單個副本并在該類的所有實例之間共享。我們初始化一個類多少次并不重要油湖。永遠只有一個靜態(tài)字段的副本屬于它巍扛。此靜態(tài)字段的值將在任何不同類的相同對象之間共享。

從內(nèi)存的角度來看乏德,靜態(tài)變量進入JVM內(nèi)存中稱為Metaspace的特定池(在Java 8之前撤奸,此池稱為Permanent Generation或PermGen,現(xiàn)已完全刪除并替換為Metaspace)喊括。

3.1 靜態(tài)字段示例

假設(shè)我們有一個帶有幾個屬性(實例變量)的Car類寂呛。每當從此Car藍圖初始化新對象時,每個新對象都會擁有這些實例變量的不同副本瘾晃。

但是,假設(shè)我們正在尋找一個變量幻妓,該變量保存已初始化并在所有實例之間共享的Car對象的數(shù)量蹦误,以便它們可以訪問它并在初始化時對其進行遞增。

這就是靜態(tài)變量的來源:

現(xiàn)在肉津,對于初始化的此類的每個對象强胰,numberOfCars變量的相同副本將遞增。因此妹沙,對于這種情況偶洋,以下斷言將成立:

3.2 使用靜態(tài)字段的令人信服的理由

當變量的值獨立于對象時

該值應(yīng)該在所有對象之間共享時

3.3 要記住的要點

由于靜態(tài)變量屬于一個類,因此可以使用類名稱直接訪問它們距糖,并且不需要任何對象引用

靜態(tài)變量只能在類級別聲明

無需對象初始化即可訪問靜態(tài)字段

盡管我們可以使用對象引用(例如ford.numberOfCars ++)訪問靜態(tài)字段玄窝,但我們應(yīng)避免使用它牵寺,因為在這種情況下,很難確定它是實例變量還是類變量恩脂;相反帽氓,我們應(yīng)該始終使用類名來引用靜態(tài)變量(例如,在本例中為Car.numberOfCars ++)

4.靜態(tài)方法(或類方法)

與靜態(tài)字段類似俩块,靜態(tài)方法也屬于類而不是對象黎休,因此可以在不創(chuàng)建其所在類的對象的情況下調(diào)用它們。它們應(yīng)在不創(chuàng)建類對象的情況下使用玉凯。

4.1 靜態(tài)方法示例

靜態(tài)方法通常用于執(zhí)行不依賴于實例創(chuàng)建的操作势腮。

如果應(yīng)該在該類的所有實例之間共享一個代碼,請使用靜態(tài)方法編寫該代碼:

靜態(tài)方法還廣泛用于創(chuàng)建實用程序或幫助程序類漫仆,因此無需創(chuàng)建這些類的新對象即可獲取它們捎拯。

只需查看JDK的Collections或Math實用程序類,Apache的StringUtils或Spring框架的CollectionUtils歹啼,然后注意所有方法都是靜態(tài)的玄渗。

4.2 使用靜態(tài)方法的令人信服的理由

訪問/操作靜態(tài)變量和其他不依賴對象的靜態(tài)方法

靜態(tài)方法廣泛用于實用程序和幫助程序類

4.3 要記住的要點

·Java中的靜態(tài)方法在編譯時解析。由于方法覆蓋是運行時多態(tài)性的一部分狸眼,因此靜態(tài)方法不能被覆蓋

·抽象方法不能是靜態(tài)的

·靜態(tài)方法不能使用此關(guān)鍵字或超級關(guān)鍵字

· 實例藤树,類方法和變量的以下組合是有效的:

? ? ? 1. 實例方法可以直接訪問實例方法和實例變量

? ? ? 2. 實例方法還可以直接訪問靜態(tài)變量和靜態(tài)方法

? ? ? 3. 靜態(tài)方法可以訪問所有靜態(tài)變量和其他靜態(tài)方法

? ? ? 4. 靜態(tài)方法不能直接訪問實例變量和實例方法;他們需要一些對象引用來這樣做

5.靜態(tài)塊

靜態(tài)塊用于初始化靜態(tài)變量拓萌。盡管可以在聲明期間直接初始化靜態(tài)變量岁钓,但是在某些情況下,我們需要進行多行處理微王。

在這種情況下屡限,靜態(tài)塊會派上用場。

如果靜態(tài)變量在初始化時需要其他多語句邏輯炕倘,則可以使用靜態(tài)塊钧大。

5.1 靜態(tài)塊示例

假設(shè)我們要使用一些預(yù)定義的值來初始化列表對象。

使用靜態(tài)塊罩旋,這變得容易:

在這個例子中啊央,不可能用所有初始值和聲明來初始化List對象。這就是為什么我們在這里利用靜態(tài)塊的原因涨醋。

5.2 使用靜態(tài)塊的令人信服的理由

如果靜態(tài)變量的初始化需要除分配外的一些其他邏輯

如果靜態(tài)變量的初始化容易出錯并且需要異常處理

5.3 要記住的要點

一個類可以有多個靜態(tài)塊

靜態(tài)字段和靜態(tài)塊的解析和執(zhí)行順序與類中存在的順序相同

6. 靜態(tài)類

Java編程語言允許我們在一個類中創(chuàng)建一個類瓜饥。它提供了一種令人信服的方式,可以將只在一個地方使用的元素進行分組浴骂,這有助于使我們的代碼更加井井有條乓土,可讀性強。

嵌套類的體系結(jié)構(gòu)分為兩種:

聲明為靜態(tài)的嵌套類稱為靜態(tài)嵌套類,而非靜態(tài)的嵌套類稱為內(nèi)部類

兩者之間的主要區(qū)別在于內(nèi)部類可以訪問封閉類的所有成員(包括私有類)趣苏,而靜態(tài)嵌套類僅可以訪問外部類的靜態(tài)成員狡相。

實際上,靜態(tài)嵌套類的行為與任何其他頂級類完全相同拦键,但包含在將對其進行訪問的唯一類中谣光,以提供更好的打包便利。

6.1 靜態(tài)類的例子

6.2 使用靜態(tài)內(nèi)部類的令人信服的理由

將僅在一個地方使用的類分組會增加封裝

代碼被帶到了更接近使用它的地方芬为。這提高了可讀性萄金,代碼更易于維護

如果嵌套類不需要對其封閉的類實例成員的任何訪問,則最好將其聲明為靜態(tài)媚朦,因為這樣一來氧敢,它就不會與外部類耦合,因此將是最優(yōu)的询张,因為它們不需要任何堆或堆棧內(nèi)存

6.3 要記住的要點

靜態(tài)嵌套類無權(quán)訪問封閉的外部類的任何實例成員孙乖;它只能通過對象的引用訪問它們

靜態(tài)嵌套類可以訪問封閉類的所有靜態(tài)成員,包括私有成員

Java編程規(guī)范不允許我們將頂級類聲明為靜態(tài)類份氧。只能將這些類(嵌套類)中的類設(shè)為靜態(tài)唯袄。

7.結(jié)論

在本文中,我們看到了static關(guān)鍵字的作用蜗帜。我們還了解了使用靜態(tài)字段恋拷,靜態(tài)方法,靜態(tài)塊和靜態(tài)內(nèi)部類的原因和優(yōu)勢厅缺。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬顾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子湘捎,更是在濱河造成了極大的恐慌诀豁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥妇,死亡現(xiàn)場離奇詭異舷胜,居然都是意外死亡,警方通過查閱死者的電腦和手機活翩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門逞带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纱新,你說我怎么就攤上這事∧屡浚” “怎么了脸爱?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未妹。 經(jīng)常有香客問我簿废,道長空入,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任族檬,我火速辦了婚禮歪赢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘单料。我一直安慰自己埋凯,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布扫尖。 她就那樣靜靜地躺著白对,像睡著了一般。 火紅的嫁衣襯著肌膚如雪换怖。 梳的紋絲不亂的頭發(fā)上甩恼,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音沉颂,去河邊找鬼条摸。 笑死,一個胖子當著我的面吹牛铸屉,可吹牛的內(nèi)容都是我干的钉蒲。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼抬探,長吁一口氣:“原來是場噩夢啊……” “哼子巾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起小压,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤线梗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怠益,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪搔,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年蜻牢,在試婚紗的時候發(fā)現(xiàn)自己被綠了烤咧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡抢呆,死狀恐怖煮嫌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抱虐,我是刑警寧澤昌阿,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響懦冰,放射性物質(zhì)發(fā)生泄漏灶轰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一刷钢、第九天 我趴在偏房一處隱蔽的房頂上張望笋颤。 院中可真熱鬧,春花似錦内地、人聲如沸伴澄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秉版。三九已至,卻和暖如春茬祷,著一層夾襖步出監(jiān)牢的瞬間清焕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工祭犯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秸妥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓沃粗,卻偏偏與公主長得像粥惧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子最盅,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 一:java概述:1突雪,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境涡贱,java的開發(fā)工...
    ZaneInTheSun閱讀 2,635評論 0 11
  • 1咏删、.java源文件: 一個以”.java“為后綴的源文件:只能有一個與文件名相同的類,可以包含其他類问词。 2督函、類方...
    Hughman閱讀 1,456評論 1 9
  • 目前見到的類、接口和枚舉類型都定義為頂層類型激挪。也就是說辰狡,都是包的直接成員,獨立于其他類型垄分。不過宛篇,類型還可以嵌套在其...
    郭藝賓閱讀 580評論 0 1
  • 寒露天,天空時朗時陰薄湿,第一川靜謐安詳叫倍,山巒起伏豌鸡,峰松林輕蕩,山民在田野里收獲著段标,用原始農(nóng)具,翻覆著巴掌大黑土炉奴。 蘆...
    a山水人家閱讀 270評論 0 0