欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中static關(guān)鍵字的作用解析

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

一、全局變量、局部變量

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

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

二、static 是什么

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

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

三、static 的特點(diǎn)和弊端

特點(diǎn)

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

弊端

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

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

四、怎么使用 static

static 變量

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

static 方法

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

static 代碼塊

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

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

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

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

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

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

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

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

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

六、面試題

誰(shuí)在前輸出誰(shuí)

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

無(wú)關(guān)順序,永遠(yuǎn)只輸出 80

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

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

相關(guān)文章

最新評(píng)論