java中静态代码块的用法 static用法详解
(一)java 靜態(tài)代碼塊 靜態(tài)方法區(qū)別
一般情況下,如果有些代碼必須在項(xiàng)目啟動(dòng)的時(shí)候就執(zhí)行的時(shí)候,需要使用靜態(tài)代碼塊,這種代碼是主動(dòng)執(zhí)行的;需要在項(xiàng)目啟動(dòng)的時(shí)候就初始化,在不創(chuàng)建對(duì)象的情況下,其他程序來調(diào)用的時(shí)候,需要使用靜態(tài)方法,這種代碼是被動(dòng)執(zhí)行的. 靜態(tài)方法在類加載的時(shí)候 就已經(jīng)加載 可以用類名直接調(diào)用
比如main方法就必須是靜態(tài)的 這是程序入口
兩者的區(qū)別就是:靜態(tài)代碼塊是自動(dòng)執(zhí)行的;
靜態(tài)方法是被調(diào)用的時(shí)候才執(zhí)行的.
靜態(tài)方法
(1)在Java里,可以定義一個(gè)不需要?jiǎng)?chuàng)建對(duì)象的方法,這種方法就是靜態(tài)方法。要實(shí)現(xiàn)這樣的效果,只需要在類中定義的方法前加上static關(guān)鍵字。例如:
public static int maximum(int n1,int n2)
使用類的靜態(tài)方法時(shí),注意:
a在靜態(tài)方法里只能直接調(diào)用同類中其他的靜態(tài)成員(包括變量和方法),而不能直接訪問類中的非靜態(tài)成員。這是因?yàn)?#xff0c;對(duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。
b 靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法調(diào)用時(shí),this所引用的對(duì)象根本沒有產(chǎn)生。
(2)靜態(tài)變量是屬于整個(gè)類的變量而不是屬于某個(gè)對(duì)象的。注意不能把任何方法體內(nèi)的變量聲明為靜態(tài),例如:
fun()
{
static int i=0;//非法。
}
(3)一個(gè)類可以使用不包含在任何方法體中的靜態(tài)代碼塊,當(dāng)類被載入時(shí),靜態(tài)代碼塊被執(zhí)行,且只被執(zhí)行一次,靜態(tài)塊常用來執(zhí)行類屬性的初始化。例如:
static
{
}
類裝載步驟
在Java中,類裝載器把一個(gè)類裝入Java虛擬機(jī)中,要經(jīng)過三個(gè)步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗(yàn)、準(zhǔn)備和解析三步,除了解析外,其它步驟是嚴(yán)格按照順序完成的,各個(gè)步驟的主要工作如下:
裝載:查找和導(dǎo)入類或接口的二進(jìn)制數(shù)據(jù);
鏈接:執(zhí)行下面的校驗(yàn)、準(zhǔn)備和解析步驟,其中解析步驟是可以選擇的;
校驗(yàn):檢查導(dǎo)入類或接口的二進(jìn)制數(shù)據(jù)的正確性;
準(zhǔn)備:給類的靜態(tài)變量分配并初始化存儲(chǔ)空間;
解析:將符號(hào)引用轉(zhuǎn)成直接引用;
初始化:激活類的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊。
初始化類中屬性是靜態(tài)代碼塊的常用用途,但只能使用一次。
(二)靜態(tài)代碼塊的初始化順序
解答:當(dāng)執(zhí)行完語句(*)時(shí),打印結(jié)果是這樣一個(gè)順序 :
parent static block child static block parent block parent constructor child block child constructor
分析:當(dāng)執(zhí)行new Child()時(shí),它首先去看父類里面有沒有靜態(tài)代碼塊,如果有,它先去執(zhí)行父類里面靜態(tài)代碼塊里面的內(nèi)容,當(dāng)父類的靜態(tài)代碼塊里面的內(nèi)容執(zhí)行完畢之后,接著去執(zhí)行子類(自己這個(gè)類)里面的靜態(tài)代碼塊,當(dāng)子類的靜態(tài)代碼塊執(zhí)行完畢之后,它接著又去看父類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行父類的非靜態(tài)代碼塊,父類的非靜態(tài)代碼塊執(zhí)行完畢,接著執(zhí)行父類的構(gòu)造方法;父類的構(gòu)造方法執(zhí)行完畢之后,它接著去看子類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行子類的非靜態(tài)代碼塊。子類的非靜態(tài)代碼塊執(zhí)行完畢再去執(zhí)行子類的構(gòu)造方法,這個(gè)就是一個(gè)對(duì)象的初始化順序。
總結(jié):
對(duì)象的初始化順序:首先執(zhí)行父類靜態(tài)的內(nèi)容,父類靜態(tài)的內(nèi)容執(zhí)行完畢后,接著去執(zhí)行子類的靜態(tài)的內(nèi)容,當(dāng)子類的靜態(tài)內(nèi)容執(zhí)行完畢之后,再去看父類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行父類的非靜態(tài)代碼塊,父類的非靜態(tài)代碼塊執(zhí)行完畢,接著執(zhí)行父類的構(gòu)造方法;父類的構(gòu)造方法執(zhí)行完畢之后,它接著去看子類有沒有非靜態(tài)代碼塊,如果有就執(zhí)行子類的非靜態(tài)代碼塊。子類的非靜態(tài)代碼塊執(zhí)行完畢再去執(zhí)行子類的構(gòu)造方法。總之一句話,靜態(tài)代碼塊內(nèi)容先執(zhí)行,接著執(zhí)行父類非靜態(tài)代碼塊和構(gòu)造方法,然后執(zhí)行子類非靜態(tài)代碼塊和構(gòu)造方法。
注意:子類的構(gòu)造方法,不管這個(gè)構(gòu)造方法帶不帶參數(shù),默認(rèn)的它都會(huì)先去尋找父類的不帶參數(shù)的構(gòu)造方法。如果父類沒有不帶參數(shù)的構(gòu)造方法,那么子類必須用supper關(guān)鍵子來調(diào)用父類帶參數(shù)的構(gòu)造方法,否則編譯不能通過。
總結(jié)
以上是生活随笔為你收集整理的java中静态代码块的用法 static用法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达登录知乎,亲自回答如何系统学习机器
- 下一篇: java基础学习笔记(二)