楊和網(wǎng)站建設(shè)學(xué)校網(wǎng)站模板
一、static關(guān)鍵字是什么?
static修飾的代碼屬于類,定義的變量存儲(chǔ)在方法區(qū)的靜態(tài)常量池當(dāng)中
二、static可以修飾什么
1.static修飾變量
static修飾的變量叫做類變量,被所有該類產(chǎn)生的對(duì)象所共享,存儲(chǔ)在方法區(qū)的靜態(tài)常量池中
2.static修飾方法
static修飾是的方法屬于靜態(tài)方法,static修飾的方法才能調(diào)用static修飾的方法
3.static修飾代碼塊
static修飾的代碼塊在main方法運(yùn)行之前運(yùn)行,其目的是優(yōu)化程序
三、java為什么設(shè)計(jì)static關(guān)鍵字
因?yàn)橐椒惾ナ褂米约旱姆椒ê妥兞?/p>
1.假設(shè)不使用static關(guān)鍵字
? ?則如果方法和變量屬于非靜態(tài),只有在對(duì)象當(dāng)中才會(huì)被分配內(nèi)存空間,也就是說只能由對(duì)象調(diào)用。如下:
2.使用static關(guān)鍵字
? ? 對(duì)于static修飾的變量或者方法,我們建議使用類去調(diào)用,雖然對(duì)象也可以做到,但是不推薦。
? ? 而從上一張圖可以看出如果沒有static關(guān)鍵字,那么類是不可以調(diào)用自己的屬性和方法的,只能用對(duì)象去調(diào)用
?四、static關(guān)鍵字修飾方法具體用法
1.static修飾的方法無法調(diào)用到非靜態(tài)方法
2.在非靜態(tài)方法當(dāng)中可以調(diào)用到靜態(tài)方法
為什么在非靜態(tài)方法中可以調(diào)用靜態(tài)方法?
????????因?yàn)閔hh被static修飾屬于類變量,存儲(chǔ)在方法區(qū)的靜態(tài)常量池當(dāng)中,被所有對(duì)象所共享。然而?fff()方法想要表達(dá)的時(shí)候就已經(jīng)創(chuàng)建好了對(duì)象,那么靜態(tài)方法一定是存在的。
五、?非運(yùn)行狀態(tài)輸出代碼結(jié)果
一套基本的流程:
示例代碼1:
代碼流程介紹:
程序執(zhí)行先去找main()方法啟動(dòng)程序
1.首先先去掃描Test類,返現(xiàn)Test類有父類Base類,先去掃描父類,發(fā)現(xiàn)Base類沒有父類
2.將Base.class加載進(jìn)方法區(qū),此時(shí)Base類當(dāng)中的static代碼塊執(zhí)行
3.將Test.class加載進(jìn)方法區(qū),此時(shí)Test類當(dāng)在的static代碼塊執(zhí)行
4.main方法入棧---->執(zhí)行new Test();去創(chuàng)建Test類的對(duì)象
5.創(chuàng)建子類對(duì)象之前先創(chuàng)建父類對(duì)象,所以先執(zhí)行Base()構(gòu)造器,在執(zhí)行Test()構(gòu)造器! |
示例代碼2:
輸出:
代碼流程介紹:
1.main方法在哪里我們就先去掃描那個(gè)類--->首先去掃描Test類,發(fā)現(xiàn)沒有父類,也沒有static修飾的代碼,那么編譯Test類,并且將main方法入棧
2.執(zhí)行new Demo("----");在執(zhí)行之前掃描Demo類,發(fā)現(xiàn)沒有父類,所以編譯Demo類,在編譯的過程中static代碼塊按順序優(yōu)先執(zhí)行
3.首先輸出的是11
4.執(zhí)行 public static Demo demo = new Demo("+++" );此時(shí)會(huì)涉及到調(diào)用Demo構(gòu)造方法,所以輸出===+++
5.輸出22
6.編譯完畢,回到main方法當(dāng)中繼續(xù)執(zhí)行new Demo(" ---");現(xiàn)在可以創(chuàng)建對(duì)象了,也就是進(jìn)行到了運(yùn)行階段
7.通過調(diào)傭構(gòu)造器創(chuàng)建對(duì)象:===---
六、Java的值傳遞
首先靜態(tài)常量池中有一個(gè)變量a,a的默認(rèn)值為0,main執(zhí)行,調(diào)用modify(a)方法入棧,注意方法的變量是局部變量,只在該方法中起作用。java進(jìn)行值傳遞,此時(shí)執(zhí)行a++,然后出棧,局部變量也就沒用了,最后輸出a的值,此時(shí)的a是靜態(tài)常量池中的變量a,值為0。
?