JAVA中的static關(guān)鍵字,執(zhí)行順序面試被問(wèn)起,你回答是否正確?
在JAVA 中有很多的關(guān)鍵字,比如 final、private、public等等很多很多,然而今天我們要聊的是static?關(guān)鍵字。
都知道在JAVA?中?static?有三個(gè)方面的作用:
修飾成員方法
修飾成員屬性
用于代碼塊
首先我們應(yīng)該明白,被static?修飾過(guò)的不論是方法,屬性還是代碼塊 ,不是作用于類實(shí)例,而是跟隨類,直接被類加載了。這一點(diǎn)非常非常重要。
下面我們一起來(lái)看看這段代碼,如果你能夠理解,那說(shuō)明是真正理解了。
這是第一個(gè)父類:
public class SuperClass {SuperClass(String str){System.out.println("Super with a string." + str);}public SuperClass() {}}
這是繼承父類的一個(gè)子類:
public class SubClass extends SuperClass {SuperClass superClass1 = new SuperClass("superClass_1");SuperClass superClass2 = new SuperClass("superClass_2");static SuperClass superClass3 = new SuperClass("superClass_3");SubClass(String SubClass){System.out.println(" this is SubClass " + SubClass);}}
這是測(cè)試類:
public class TestClass {static SuperClass superClass4 = new SuperClass("superClass_4");public static void main(String[] args) {System.out.println("test start");SuperClass superClass = new SuperClass("superClass");System.out.println("_______________________________");SubClass subClass = new SubClass("subClass");}}
現(xiàn)在執(zhí)行?TestClass?的 main 方法,你知道會(huì)打印出來(lái)什么呢?
什么也不說(shuō),直接上程序執(zhí)行的結(jié)果圖

程序打印的第一句話是:?Super with a string.superClass_4
是因?yàn)樵?span id="go7utgvlrp" class="code-snippet__title" style="font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace;font-size:14px;text-align:left;background-color:rgba(0,0,0,.03);">TestClass類中,是這樣定義?的?
static SuperClass superClass4 = new SuperClass("superClass_4");
程序在執(zhí)行的時(shí)候,而superClass4 是被static關(guān)鍵字修飾的,所以會(huì)先執(zhí)行?new SuperClass("superClass_4")。
接下來(lái)會(huì)執(zhí)行:?System.out.println("test start");
再執(zhí)行:SuperClass superClass = new SuperClass("superClass");
至于后面的4行執(zhí)行結(jié)果:
也能夠理解了吧。
現(xiàn)在如果我做一下變動(dòng):
static SuperClass superClass4 = new SuperClass("superClass_4");變?yōu)椋?br />
static SuperClass superClass_4 = new SubClass("superClass_4");細(xì)心的同學(xué)會(huì)發(fā)現(xiàn):?SuperClass?變成了??SubClass
如果是這樣,我們一起來(lái)看看這個(gè)結(jié)果到底是怎么樣的?

上面紅色框打印的東西,很多同學(xué)應(yīng)該會(huì)理解,但下面這個(gè)紅色框里的信息可能有同學(xué)就有些疑惑了?
Super with a string.superClass_1Super with a string.superClass_2this is SubClass subClass
可能會(huì)問(wèn):耶??怎么不打印
Super with a string.superClass_3如果能夠理解其原理,當(dāng)然知道為什么不打印;而如果沒(méi)發(fā)現(xiàn)這點(diǎn)的話,這只能說(shuō)對(duì)static 關(guān)鍵字還沒(méi)理解到位,不過(guò)沒(méi)關(guān)系,只需要繼續(xù)往下看,我們繼續(xù)分析。
在?TestClass類中:
定論了??static SuperClass superClass_4 =new SubClass("superClass_4")
main 方法里面執(zhí)行了?SubClass subClass = new SubClass("subClass");
都引用了?SubClass?這個(gè)類,回頭來(lái)看看這個(gè)屬性是怎么定義的:
static SuperClass superClass3 = new SuperClass("superClass_3");是一個(gè)被?static ?修飾的屬性 superClass3 ,這就說(shuō)明這個(gè)屬性是屬于SubClass類的,后面在使用 new 關(guān)鍵字實(shí)例化 SubClass 時(shí), superClass3 只會(huì)被實(shí)例化一次。所以在上面打?。?/span>
Super with a string.superClass_3只會(huì)出現(xiàn)一次。
另外還有一個(gè)點(diǎn)沒(méi)有講到,實(shí)例化一個(gè)類的過(guò)程:
首先:是實(shí)例化類對(duì)象的屬性(優(yōu)先級(jí)別:靜態(tài)屬性?>?非靜態(tài)屬性)
然后:調(diào)用構(gòu)造方法
好了,今天關(guān)于JAVA中?static?關(guān)鍵字的知識(shí)就寫(xiě)到這里。
