全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Java——static關(guān)鍵字

更新時(shí)間:2018-09-12 來(lái)源:黑馬程序員JavaEE培訓(xùn)學(xué)院 瀏覽量:

【Java】——static關(guān)鍵字

 

static是什么???——》一個(gè)修飾符

那static作用于那???——》用于修飾成員

什么是成員???——》成員變量和成員函數(shù)

 

static修飾成員變量

static為什么修飾成員變量???——》解決數(shù)據(jù)的共享問(wèn)題???——》static修飾的數(shù)據(jù)可以被每個(gè)對(duì)象共享的數(shù)據(jù)

為什么需要被每個(gè)對(duì)象共享某個(gè)數(shù)據(jù)???——》如果所有對(duì)象中某一個(gè)屬性的值是一樣的,那么在內(nèi)存中會(huì)造成大量的數(shù)據(jù)重復(fù);

 

那怎么實(shí)現(xiàn)static的作用???——》

 

被修飾后的成員變量的存儲(chǔ)如圖所示:

                   

被static修飾后的成員變量的存儲(chǔ)在哪里???——》即不在堆里也不在棧里,而是在方法區(qū)的靜態(tài)區(qū)里

靜態(tài)區(qū)???——》放一些靜態(tài)變量和靜態(tài)方法。

存放好了,那該如何調(diào)用這種數(shù)據(jù)(或方法)?——》類(lèi)名調(diào)用

 

既然知道了static是什么和如何運(yùn)用等;那么我們也該了解靜態(tài)變量和成員變量有什么區(qū)別???——》

·1)、別名不同???——》成員變量也稱(chēng)為實(shí)例變量;靜態(tài)變量也稱(chēng)為類(lèi)變量。

·2)、兩個(gè)變量的生命周期不同???——》也是靜態(tài)的弊端,生命周期太長(zhǎng),但是也好過(guò)占用內(nèi)存;——》成員變量隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的回收而被釋放;

·3)、靜態(tài)變量隨著類(lèi)的加載而存在,會(huì)隨著類(lèi)的消失而消失???——》虛擬機(jī)結(jié)束了,類(lèi)才會(huì)消失,并且類(lèi)本身是一個(gè)對(duì)象,在內(nèi)存里面也是按照對(duì)象的形式存儲(chǔ)的,只不過(guò)可以通過(guò)這個(gè)類(lèi)對(duì)象創(chuàng)建很多對(duì)象來(lái)封裝具體的數(shù)據(jù);

·4)、當(dāng)類(lèi)的數(shù)據(jù)過(guò)多的時(shí)候,垃圾回收機(jī)制可以對(duì)舊數(shù)據(jù)進(jìn)行回收???——》當(dāng)再次使用再重新加載,如果類(lèi)很長(zhǎng)時(shí)間不用就把它清除;

·5)、調(diào)用方式不同???——》成員變量只能被對(duì)象調(diào)用;——》靜態(tài)變量可以被對(duì)象調(diào)用,還可以被類(lèi)名調(diào)用;

·注意:不管有沒(méi)有對(duì)象,都建議用類(lèi)名調(diào)用???——》這是靜態(tài)的專(zhuān)屬調(diào)用方式,可閱讀性強(qiáng),讓人看了一目了然,知道這是靜態(tài)變量;

·6)、類(lèi)的類(lèi)型變量與類(lèi)變量不是一碼事???——》類(lèi)的類(lèi)型變量是由類(lèi)定義的變量,類(lèi)變量就是靜態(tài)變量;

·7)、數(shù)據(jù)存儲(chǔ)位置不同???——》成員變量數(shù)據(jù)存儲(chǔ)在堆內(nèi)存的對(duì)象中,所以也叫對(duì)象的特有數(shù)據(jù);——》靜態(tài)變量數(shù)據(jù)存儲(chǔ)在方法區(qū)的靜態(tài)區(qū)中,所以也叫對(duì)象的共享數(shù)據(jù);

 

注意:

方法區(qū)???——》也叫共享區(qū),數(shù)據(jù)區(qū)·····翻譯的名字多著呢,還記得之前五個(gè)區(qū)不?

方法存在方法區(qū),調(diào)用時(shí)進(jìn)棧;

 

當(dāng)static修飾成員函數(shù)

為什么static要修飾成員函數(shù)使之成為一個(gè)靜態(tài)函數(shù)???——》這是因?yàn)閟tatic有其作用之處;

靜態(tài)函數(shù)作用于哪里???——》可以直接訪(fǎng)問(wèn)靜態(tài)成員,靜態(tài)方法;但是如果要訪(fǎng)問(wèn)成員方法,只能通過(guò)對(duì)象訪(fǎng)問(wèn);

為什么靜態(tài)成員的出現(xiàn)比對(duì)象要早???——》靜態(tài)變量和靜態(tài)方法都是存放在靜態(tài)區(qū)中的,會(huì)隨著類(lèi)的加載而加載

如何使靜態(tài)函數(shù)調(diào)用非靜態(tài)方法(或靜態(tài)變量)???——》必須要在靜態(tài)函數(shù)內(nèi)部創(chuàng)建一個(gè)對(duì)象???——》以確保對(duì)象是和靜態(tài)方法是一起出現(xiàn)的;???——》對(duì)象才調(diào)用非靜態(tài)的方法和變量;

 

使用static修飾成員函數(shù)該注意以下幾點(diǎn):

1.靜態(tài)方法只能訪(fǎng)問(wèn)靜態(tài)成員(包含成員變量成員函數(shù)),非靜態(tài)既可以訪(fǎng)問(wèn)靜態(tài)又可以訪(fǎng)問(wèn)非靜態(tài);

2.靜態(tài)方法中不可以定義this(寫(xiě)this是會(huì)報(bào)錯(cuò)的)???——》因?yàn)橛妙?lèi)名調(diào)用靜態(tài)方法時(shí)沒(méi)有對(duì)象,所以this沒(méi)有指向;

 

三句話(huà)圖解static在內(nèi)存中的姿勢(shì):

 

首先我們先來(lái)分析這段代碼:

當(dāng)我們執(zhí)行StaticDemo2的字節(jié)碼文件的時(shí)候,這個(gè)類(lèi)被加載進(jìn)內(nèi)存,然后進(jìn)行空間的開(kāi)辟,不同種類(lèi)數(shù)據(jù)存放在不一樣的地方。

方法區(qū)里有一個(gè)靜態(tài)區(qū),存放靜態(tài)方法和數(shù)據(jù),非靜態(tài)區(qū)里存放非靜態(tài)的方法和數(shù)據(jù),它們都是被共享的。

非靜態(tài)區(qū)里面都有一個(gè)this所屬,內(nèi)容只能被對(duì)象調(diào)用;

靜態(tài)區(qū)里有一個(gè)所屬是自己的類(lèi)名,沒(méi)有this,this是不能寫(xiě)在靜態(tài)方法里的,所以此時(shí),當(dāng)我們調(diào)用這個(gè)StaticDemo2類(lèi)的時(shí)候,內(nèi)存的加載如下:

 

當(dāng)運(yùn)行到主函數(shù)的時(shí)候,主函數(shù)進(jìn)棧:

第一句話(huà):使用到了Person類(lèi),此時(shí)找classPath路徑下是否有Person.class文件,如果沒(méi)有設(shè)置classPath,默認(rèn)在當(dāng)前路徑下找,找到Person文件后加載Person類(lèi),加載完畢后,運(yùn)行method()方法,method()方法進(jìn)棧,語(yǔ)句執(zhí)行完畢,運(yùn)行默認(rèn)的return語(yǔ)句,方法出棧。

                           

第二句話(huà):在主函數(shù)中定義一個(gè)Person類(lèi)型的變量p,在堆中創(chuàng)建一個(gè)新對(duì)象,為對(duì)象分配地址,堆內(nèi)存對(duì)對(duì)象進(jìn)行數(shù)據(jù)初始化,然后傳參數(shù)進(jìn)行構(gòu)造函數(shù)初始化,構(gòu)造函數(shù)進(jìn)棧,執(zhí)行完畢彈棧。                                                  

第三句話(huà):p.show()在編譯運(yùn)行之前都要檢查是否有show()方法,如果有show()方法,show()方法進(jìn)棧,并且show()方法是非靜態(tài)的方法,所以show()方法里也應(yīng)該有默認(rèn)的this引用,此時(shí)this的值是所屬的函數(shù)的調(diào)用對(duì)象的值,在輸出語(yǔ)句中可以通過(guò)類(lèi)的所屬找到country,通過(guò)this找到name和age。執(zhí)行完畢后結(jié)束函數(shù)                                        不加靜態(tài)是在對(duì)象里,加了靜態(tài)是在方法區(qū)里;

不加靜態(tài)是特定對(duì)象特有,加了靜態(tài)對(duì)象共有。

對(duì)象的特有數(shù)據(jù),必須存儲(chǔ)在對(duì)象中???——》數(shù)據(jù)在對(duì)象中都是不同,不能使用static修飾;

簡(jiǎn)單點(diǎn)說(shuō),從源代碼看,該功能是否需要訪(fǎng)問(wèn)非靜態(tài)的成員變量,如果需要,該功能就是非靜態(tài)的。如果不需要,就可以將該功能定義成靜態(tài)的,當(dāng)然也可以定義成非靜態(tài),但是非靜態(tài)需要被對(duì)象調(diào)用,而僅創(chuàng)建對(duì)象調(diào)用非靜態(tài)的方法,沒(méi)有訪(fǎng)問(wèn)特有數(shù)據(jù),該對(duì)象的創(chuàng)建是沒(méi)有意義的。

 

作者:黑馬程序員JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itheima.com/


分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!