最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中static關鍵字的作用解析

 更新時間:2023年11月07日 09:48:22   作者:JFS_Study  
這篇文章主要介紹了Java中static關鍵字的作用解析,Java 中,不能在所有類之外定義全局變量,只能通過在一個類中定義公用、靜態(tài)的變量來實現(xiàn)一個全局變量,需要的朋友可以參考下

一、全局變量、局部變量

全局變量就好比一個容器或者一個公用的東西一樣,就類似外面公共場所的凳子一樣,大家都可以使用這個凳子。Java 中,不能在所有類之外定義全局變量,只能通過在一個類中定義公用、靜態(tài)的變量來實現(xiàn)一個全局變量。

局部變量就是局部的東西,如果全局變量是桌子,局部變量就類似于抽屜,只能在一小部分地方使用,很局限。全局變量是外面公共場所的凳子,局部變量則就像某個酒店的凳子一樣,在酒店內(nèi)部,只有去住酒店才能使用。

二、static 是什么

Java 中并不存在全局變量的概念,但是可以通過 static 來實現(xiàn)一個“偽全局”的概念,Java 中 static 表示“全局”或者“靜態(tài)”的意思,用來修飾成員變量和成員方法,當然也可以修飾代碼塊。 Java 把內(nèi)存分為棧內(nèi)存和堆內(nèi)存,其中棧內(nèi)存用來存放一些基本類型的變量、數(shù)組和對象的引用,堆內(nèi)存主要存放一些對象。

在 JVM 加載一個類的時候,若該類存在 static 修飾的成員變量和成員方法,則會為這些成員變量和成員方法在固定的位置開辟一個固定大小的內(nèi)存區(qū)域,有了這些“固定”的特性,那么 JVM 就可以非常方便地訪問它們。同時如果靜態(tài)的成員變量和成員方法不出作用域的話,它們的句柄都會保持不變。同時 static 所蘊含“靜態(tài)”的概念表示著它是不可恢復的,即在那個地方,你修改了,它是不會變回原樣的;你清理了,它就不會回來了。 同時被 static 修飾的成員變量和成員方法是獨立于該類的,它不依賴于某個特定的實例變量,也就是說它被該類的所有實例共享。所有實例的引用都指向同一個地方,任何一個實例對其的修改都會導致其它實例的變化。

三、static 的特點和弊端

特點

  • 隨著類的加載而加載。
  • 優(yōu)先于對象存在。
  • 所有對象共享。
  • 可以被類名直接調用。

弊端

  • 生命周期過長,隨著類的消失而消失。
  • 靜態(tài)方法只能訪問靜態(tài)成員。
  • 靜態(tài)方法中不能使用 this,super 關鍵字。
  • static 變量在定義時必須要進行初始化,且初始化時間要早于非靜態(tài)變量。

總結:無論是變量,方法,還是代碼塊,只要用 static 修飾,就是在類被加載時就已經(jīng)”準備好了”,也就是可以被使用或者已經(jīng)被執(zhí)行,都可以脫離對象而執(zhí)行。反之,如果沒有 static,則必須要依賴于對象實例。

四、怎么使用 static

static 變量

static 修飾的變量,稱之為靜態(tài)變量,沒有用 static 修飾的變量稱之為實例變量。二者的區(qū)別是: 靜態(tài)變量是隨著類加載時被完成初始化的,它在內(nèi)存中僅有一個,且 JVM 也只會為它分配一次內(nèi)存,同時類所有的實例都共享靜態(tài)變量,可以直接通過類名來訪問它。而實例變量則不同,它是伴隨著實例的,每創(chuàng)建一個實例就會產(chǎn)生一個實例變量,它與該實例同生共死。 所以一般在【對象之間共享數(shù)據(jù)】時使用靜態(tài)變量,訪問方便。

static 方法

static 修飾的方法,稱之為靜態(tài)方法,通過類名對其進行直接調用。由于它在類加載的時候就存在了,它不依賴于任何實例,所以 static 方法必須實現(xiàn),也就是說它不能是抽象方法 abstract。 static 方法是類中的一種特殊方法,只有在真正需要它們的時候才會將方法聲明為 static。如 Math 類的所有方法都是靜態(tài) static 的。

static 代碼塊

被 static 修飾的代碼塊,稱之為靜態(tài)代碼塊。靜態(tài)代碼塊會隨著類的加載一塊執(zhí)行,而且它可以隨意放,可以存在于該類的任何地方。

五、Java 中為什么靜態(tài)方法可以直接被調用

把類看作是一個房子。房子里面所有的人共用一套家具。也就是說,這些家具是唯一的,如果某個家具壞了,那么大家都用不了。

再看定義,Java 的靜態(tài)變量也叫做類變量,它開始于類的創(chuàng)建,結束于類的消亡。非靜態(tài)變量叫做實例變量,它開始于類的實例的創(chuàng)建,結束于類的實例的消亡。

靜態(tài)變量被所有實例所共享。如上面的例子,座椅板凳是類變量,它們是在房子被建好了之后就被添加放置進來,而且基本都是唯一的。

人就相當于實例,每個人都能用這些家具,但是如果家具一旦損壞,那就是壞了,或者把某一個家具搬走,那么所有的人都用不了這個家具,房子里也不存在這個家具了。

房子里可以進很多人,可以進張三,可以進李四。所以這些人就是類的實例對象,他們身上穿的衣服就可以叫做實例變量。

如果一個類中有靜態(tài)變量的話,程序首先會把該靜態(tài)變量加載進內(nèi)存中,也就是在堆中開辟一個區(qū)域專門存放。以后不管 new 多少個類的對象,該靜態(tài)變量永遠都是在那里的。也就是說,靜態(tài)變量在類的初始化一次后,系統(tǒng)就不會為該變量開辟新的內(nèi)存空間。而每 new 一個類的對象,系統(tǒng)就會重新在堆內(nèi)存中開辟一個新空間來存放該類的實例對象,并且棧中也會有一個新的引用變量去指向它。

靜態(tài)方法也是類似,但是有一點要強調,靜態(tài)方法中不能調用非靜態(tài)方法。因為被 static 修飾的方法會首先被 Classloader 對象先加載進內(nèi)存,而這個時候可能其它的非靜態(tài)方法或者變量還沒有被加載進來。就好比現(xiàn)在想做包子,現(xiàn)在面粉被 static 修飾,首先已經(jīng)拿到身邊,可是因為包子餡不是 static 修飾的,所以可能包子餡兒還沒運過來,你說怎么做的出包子呢。被 static 修飾過的都是隨著類的初始化后就產(chǎn)生了,在堆內(nèi)存中都有一塊專門的區(qū)域來存放,所以只需要類名點方法名或者變量名即可。而非靜態(tài)的就必須通過類的對象去調。

六、面試題

誰在前輸出誰

public class StaticDemo {
    public static void main(String[] args) {
        System.out.println(StaticDemo.m);
    }
    static int m = 80;
    static {
         m = 60;
    }
}

無關順序,永遠只輸出 80

public class StaticDemo {
    public static void main(String[] args) {
        System.out.println(StaticDemo.m);
    }
    static int m = 80;
    static {
        int m = 60;
    }
}

到此這篇關于Java中static關鍵字的作用解析的文章就介紹到這了,更多相關Java中static關鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于IDEA MybatisX插件的使用小技巧

    關于IDEA MybatisX插件的使用小技巧

    這篇文章主要介紹了關于MybatisX插件的使用小技巧,MybatisX是IDEA的一款第三方插件,可以極大地提升我們的開發(fā)效率,一起來看看吧
    2023-03-03
  • springmvc實現(xiàn)導出數(shù)據(jù)信息為excle表格示例代碼

    springmvc實現(xiàn)導出數(shù)據(jù)信息為excle表格示例代碼

    本篇文章主要介紹了springmvc實現(xiàn)導出數(shù)據(jù)信息為excle表格,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。
    2017-01-01
  • Spring session整合到Redis過程解析

    Spring session整合到Redis過程解析

    這篇文章主要介紹了Spring session整合到Redis過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java檢查StringBuilder是否包含字符串的幾種方法

    Java檢查StringBuilder是否包含字符串的幾種方法

    在Java中,檢查StringBuilder是否包含字符串(即非空)的最直接方法是檢查其長度,本文整理了一些判斷方法,感興趣的小伙伴可以了解一下
    2025-06-06
  • 在CentOS系統(tǒng)上安裝Java?JDK?8簡單步驟

    在CentOS系統(tǒng)上安裝Java?JDK?8簡單步驟

    最近購買一臺新的云服務器,用于開發(fā)學習使用,因此需要安裝很多的組件,下面這篇文章主要給大家介紹了關于在CentOS系統(tǒng)上安裝Java?JDK8的簡單步驟,需要的朋友可以參考下
    2023-12-12
  • Java中的SuppressWarnings注解使用

    Java中的SuppressWarnings注解使用

    這篇文章主要介紹了Java中的SuppressWarnings注解使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Spring容器初始化擴展點之ApplicationContextInitializer詳解

    Spring容器初始化擴展點之ApplicationContextInitializer詳解

    ApplicationContextInitializer是Spring框架提供的一個接口,用于在Spring應用上下文刷新之前對其進行自定義初始化,本文介紹Spring容器初始化擴展點之ApplicationContextInitializer,感興趣的朋友一起看看吧
    2025-02-02
  • java實現(xiàn)AES可逆加密算法

    java實現(xiàn)AES可逆加密算法

    這篇文章主要為大家詳細介紹了java實現(xiàn)AES可逆加密算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • java中對象和Map互相轉換的幾種常見方式舉例

    java中對象和Map互相轉換的幾種常見方式舉例

    Map在日常開發(fā)應用中的頻率很高,最常用的實現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關于java中對象和Map互相轉換的幾種常見方式舉例,需要的朋友可以參考下
    2024-01-01
  • Spring運行時手動注入bean的方法實例

    Spring運行時手動注入bean的方法實例

    spring給我們提供了IOC服務,讓我們可以用注解的方式,方便的使用bean的相互引用,下面這篇文章主要給大家介紹了關于Spring運行時手動注入bean的相關資料,需要的朋友可以參考下
    2022-05-05

最新評論

鹿泉市| 惠来县| 自贡市| 麻阳| 河曲县| 且末县| 依兰县| 高尔夫| 新营市| 陆川县| 靖州| 合江县| 湟源县| 宿州市| 深圳市| 教育| 怀仁县| 金沙县| 青河县| 龙口市| 揭阳市| 尚志市| 方正县| 南乐县| 长乐市| 广饶县| 陵水| 永吉县| 青田县| 包头市| 铜陵市| 班玛县| 长治县| 石泉县| 夹江县| 连州市| 克山县| 英超| 安平县| 东乡族自治县| 西丰县|